一文搞定Python读取文件的全部知识(转)

原文地址:
https://mp.weixin.qq.com/s/8vD52nxjUWJXfMtJg09Qcg

打开文件

内置函数 open 可以帮助我们以不同的模式打开文件。open() 函数接受两个基本参数:文件名和模式。默认模式是“r”,它以只读方式打开文件。

f = open('zen_of_python.txt', 'r')
print(f.read())
f.close() # 必须在操作完文件后关闭它们,以释放资源并避免引发异常

在 Python 中,我们可以使用 with 上下文管理器来确保程序在文件关闭后释放使用的资源,即使发生异常也是如此

with open('zen_of_python.txt') as f:
    print(f.read())

上面的代码使用 with 语句创建了一个上下文,并绑定到变量 f ,所有文件对象方法都可以通过该变量访问文件对象。
当程序到达 with 语句块上下文的末尾时,它会关闭文件以释放资源并确保其他程序可以正常调用它们。通常当我们处理不再需要使用的,需要立即关闭的对象(例如文件、数据库和网络连接)时,强烈推荐使用 with 语句。
这里需要注意的是,即使在退出 with 上下文管理器块之后,我们也可以访问 f 变量,但是该文件是已关闭状态。让我们尝试一些文件对象属性,看看变量是否仍然存在并且可以访问:

print("Filename is '{}'.".format(f.name))
if f.closed:
    print("File is closed.")
else:
    print("File isn't closed.")

Output:

Filename is 'zen_of_python.txt'.
File is closed.

但是此时是不可能从文件中读取内容或写入文件的,关闭文件时,任何访问其内容的尝试都会导致错误。

模式说明

正如我们在前面提到的,我们需要在打开文件时指定模式。下表是 Python 中的不同的文件模式:

  • 'r' 打开一个只读文件
  • 'w' 打开一个文件进行写入。如果文件存在,会覆盖它,否则会创建一个新文件
  • 'a' 打开一个仅用于追加的文件。如果该文件不存在,会创建该文件
  • 'x' 创建一个新文件。如果文件存在,则失败
  • '+' 打开一个文件进行更新

我们还可以指定以文本模式“t”、默认模式或二进制模式“b”打开文件。让我们看看如何使用简单的语句复制图像文件 dataquest_logo.png:

# 复制 Dataquest 徽标图像并将其存储在同一路径中。'rb' 模式以二进制模式打开文件并进行读取,而 'wb' 模式以文本模式打开文件以并行写入
with open('dataquest_logo.png', 'rb') as rf:
    with open('data_quest_logo_copy.png', 'wb') as wf:
        for b in rf:
            wf.write(b)

读取文本文件

读取指定字节

到目前为止,我们已经了解到可以使用 read() 方法读取文件的全部内容。如果我们只想从文本文件中读取几个字节怎么办,可以在 read() 方法中指定字节数。让我们尝试一下:

with open('zen_of_python.txt') as f:
    print(f.read(17)) # 读取 zen_of_python.txt 文件的前 17 个字节并将它们打印出来

读取一行

有时一次读取一行文本文件的内容更有意义,在这种情况下,我们可以使用 readline() 方法

with open('zen_of_python.txt') as f:
    print(f.readline())

以下代码通过逐行迭代来输出整个文件,直到跟踪我们正在读取或写入文件的位置的文件指针到达文件末尾。当 readline() 方法到达文件末尾时,它返回一个空字符串

with open('zen_of_python.txt') as f:
    line = f.readline()
    while line:
        print(line, end='')
        line = f.readline()

读出所有行

读取文本文件的另一个有用方法是 readlines() 方法,将此方法应用于文件对象会返回包含文件每一行的字符串列表

with open('zen_of_python.txt') as f:
    lines = f.readlines()

让我们检查 lines 变量的数据类型,然后打印它:

print(type(lines))
print(lines)
Output:
<class 'list'>
['The Zen of Python, by Tim Peters\n', '\n', 'Beaut...]

读取 CSV 文件

读取一行

import csv
with open('chocolate.csv') as f:
    reader = csv.reader(f, delimiter=',')
    # 奇怪的是 reader 读取一次后,reader会被清空???
    for row in reader:
        print(row)

访问行中的指定列

CSV 文件的每一行形成一个列表,其中每列都可以以索引形式访问:

import csv
with open('chocolate.csv') as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        # 打印第1列和第6列
        print("The {} company is located in {}.".format(row[0], row[5]))

以列名访问数据

在这种情况下,我们不使用 reader() 方法,而是使用返回字典对象集合的 DictReader() 方法

import csv
with open('chocolate.csv') as f:
    dict_reader = csv.DictReader(f, delimiter=',')
    for row in dict_reader:
        print("The {} company is located in {}.".format(row['Company'], row['Company Location']))

按序号排序

with open('chocolate.csv') as f:
    dict_reader = csv.DictReader(f, delimiter=',')
    aaa = sorted(dict_reader, key=lambda x:int(x['序号']), reverse=True)
    print(aaa)

读取 JSON 文件

接下来我们将加载一个 JSON 文件并将其作为 JSON 对象使用,而不是作为文本文件,为此我们需要导入 JSON 模块。然后在 with 上下文管理器中,我们使用了属于 json 对象的 load() 方法,它加载文件的内容并将其作为字典存储在上下文变量中。

import json
with open('movie.json') as f:
    content = json.load(f)
    print(content)

Output:

{'Title': 'Bicentennial Man', 'Release Date': 'Dec 17 1999', 'MPAA Rating': 'PG', 'Running Time min': 132, 'Distributor': 'Walt Disney Pictures', 'Source': 'Based on Book/Short Story', 'Major Genre': 'Drama', 'Creative Type': 'Science Fiction', 'Director': 'Chris Columbus', 'Rotten Tomatoes Rating': 38, 'IMDB Rating': 6.4, 'IMDB Votes': 28827}

让我们检查内容变量的数据类型:

print(type(content))

Output:

<class 'dict'>

它的数据类型是字典,因此我们可以方便的从中提取数据

print('{} directed by {}'.format(content['Title'], content['Director']))

Output:

Bicentennial Man directed by Chris Columbus
posted @ 2022-06-23 11:50  汉学  阅读(247)  评论(0)    收藏  举报