按字节读取
如果文件较小,一次性读取所有内容确实比较方便。但是,如果文件很大,比如有 100G,那就不能一次性读取所有内容了。这时,我们构造一个固定长度的缓冲区,来不断读取文件内容。
看看例子:
with open('path/to/file', 'r') as f:
while True:
piece = f.read(1024) # 每次读取 1024 个字节(即 1 KB)的内容
if not piece:
break
print piece
在上面,我们使用 f.read(1024) 来每次读取 1024 个字节(1KB) 的文件内容,将其存到 piece,再对 piece 进行处理。
事实上,我们还可以结合 yield 来使用:
def read_in_chunks(file_object, chunk_size=1024):
"""Lazy function (generator) to read a file piece by piece.
Default chunk size: 1k."""
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data
with open('path/to/file', 'r') as f:
for piece in read_in_chunks(f):
print piece
逐行读取
在某些情况下,我们希望逐行读取文件,这时可以使用 readline() 方法。
看看例子:
with open('data.txt', 'r') as f:
while True:
line = f.readline() # 逐行读取
if not line:
break
print line, # 这里加了 ',' 是为了避免 print 自动换行
执行结果:
10 1 9 9
6 3 2 8
20 10 3 23
1 4 1 10
10 8 6 3
10 2 1 6
文件迭代器
在 Python 中,文件对象是可迭代的,这意味着我们可以直接在 for 循环中使用它们,而且是逐行迭代的,也就是说,效果和 readline() 是一样的,而且更简洁。
看看例子:
with open('data.txt', 'r') as f:
for line in f:
print line
在上面的代码中,f 就是一个文件迭代器,因此我们可以直接使用 for line in f,它是逐行迭代的。
看看执行结果:
10 1 9 9
6 3 2 8
20 10 3 23
1 4 1 10
10 8 6 3
10 2 1 6
再看一个例子:
with open(file_path, 'r') as f:
lines = list(f)
print lines
执行结果:
['10\t1\t9\t9\n', '6\t3\t2\t8\n', '20\t10\t3\t23\n', '1\t4\t1\t10\n', '10\t8\t6\t3\n', '10\t2\t1\t6']
可以看到,我们可以对文件迭代器执行和普通迭代器相同的操作,比如上面使用 list(open(filename)) 将 f 转为一个字符串列表,这样所达到的效果和使用 readlines 是一样的。 |