按行读取解析如 csv、json、excel 等文件内容,通常每行也有按照约定的分隔符进行分开内容;针对这种场景 python 有多种方法实现,open()
方法打开文件,调用 read()
、read(size)
、readline()
、readlines()
等函数读内容,最后调 close()
对文件进行关闭。
推荐方式
with open('filename') as f:
for line in f:
print(line)
从 python 2.6 开始,with
成为默认关键字,with ... as ...
是一个控制流语句,跟 if for while try 之类的是一类,with 可以用来简化 try ... finally ...
代码,用很优雅的方式处理上下文环境产生的异常,无需在 finally 里显性调用 close()
方法,自动帮我们调用关闭方法。
在 python 中,文件对象是可迭代的,这意味着我们可以直接在 for 循环中使用它们(如上示例),而且是逐行迭代的,效果和 readline()
是一样的,而且更简洁。
读操作分解
在 python 中,读文件主要分为三个步骤:
- 打开文件
- 读取内容
- 关闭文件
打开文件
f = open('/path/to/file', 'r')
打开文件调用 open 方法,参数除了指定文件外,还需设置打开模式。
open 函数的常用模式主要有:
参数 | 模式 |
---|---|
'r' | 读模式 |
'w' | 写模式 |
'a' | 追加模式 |
'b' | 二进制模式(可添加到其他模式中使用) |
'+' | 读/写模式(可添加到其他模式中使用) |
读取内容
通常而言,读取文件有以下几种方式:
- 一次性读取所有内容,使用 r
ead()
或readlines()
按字节读取,使用 read(size)
- 按行读取,使用
readline()
关闭文件
关闭文件的操作是调用文件对象的 close()
方法,除了 with ... as ...
语句中自动帮我们调用,在 try ... finally
里需要在 finally
里显性调用。
try:
f = open('/path/to/file', 'r') # 打开文件
data = f.read() # 读取文件内容
finally:
if f:
f.close() # 确保文件被关闭
with ... as ... 方式
除了推荐方式,直接迭代文件对象,也可以结合 with ... as ... 调用读取方法逐行读取。
readlines()
with open('/path/to/file') as f:
data_list = f.readlines()
if data_list:
for line in data_list:
print(line)
readlines()
同样也是一次性读取所有内容,但与 read()
不一样的是直接返回字符串列表类型,所以直接遍历列表即可。
read()
with open('/path/to/file') as f:
data_str = f.read()
if data_str:
for line in data_str.split('\n'):
print(line)
read()
一次性读取所有内容,并返回字符串类型,所以要一行一行处理,需要按照换行符 \n
分隔后再操作。
try ... finally ... 方式
readlines()
try:
f = open('/path/to/file', 'r')
data_list = f.readlines()
if data_list:
for line in data_list:
print(line)
finally:
if f:
f.close()
read()
try:
f = open('/path/to/file', 'r')
data_str = f.read()
if data_str:
for line in data_str.split('\n'):
print(line)
finally:
if f:
f.close()