一文搞定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

浙公网安备 33010602011771号