参考bobby python高级编程 第八章
通常做法
- 使用f.read()读取全部数据,但是对于大文件会memory error
- 使用按行读取的方式,实际上也会造成内存溢出
for line in f.readlines()
将数据存到list中while True: line = f.readline() if not line: break
-
while True: chunk = f.read(1024) if not chunk: #表示读取到文件末尾了 break
使用read(size)的形式,指定每次读取的长度
Pythonic 的方法
with open(filename, 'rb') as f:
for line in f:
<do something with the line>
对可迭代对象 f,进行迭代遍历:for line in f,会自动地使用缓冲IO(buffered IO)以及内存管理,而不必担心任何大文件的问题。
- 这样做仅限于读取多行的大文件,如果大文件仅有一行还是会出现内存溢出的问题
新学的方法
- 利用read(size)的方式每次读取size个字符,同时假定一行大文件有固定的分隔符
def my_readlines(f, new_line):
buf = '' # 缓存每次读取的数据和 上一次读取数据分隔符后的剩余数据
while True:
while new_line in buf: # 判断分隔符是否出现在缓存数据中
pos = buf.index(new_line) # 找到分隔符的位置
yield buf[:pos]
buf = buf[pos + len(new_line):]
chunk = f.read(4096*10)
if not chunk: # 读到了文件结尾
yield buf # yield最后一个分隔符后面的数据
break
buf += chunk
with open('test.txt', 'rb', encoding='utf-8') as f:
for line in my_readlines(f, '#'):
print(line)