參考bobby python高級編程 第八章
通常做法
- 使用f.read()讀取全部數(shù)據(jù)斧拍,但是對于大文件會memory error
- 使用按行讀取的方式拧抖,實(shí)際上也會造成內(nèi)存溢出
for line in f.readlines()
將數(shù)據(jù)存到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筛谚,進(jìn)行迭代遍歷:for line in f族操,會自動地使用緩沖IO(buffered IO)以及內(nèi)存管理鸠窗,而不必?fù)?dān)心任何大文件的問題妓羊。
- 這樣做僅限于讀取多行的大文件,如果大文件僅有一行還是會出現(xiàn)內(nèi)存溢出的問題
新學(xué)的方法
- 利用read(size)的方式每次讀取size個(gè)字符稍计,同時(shí)假定一行大文件有固定的分隔符
def my_readlines(f, new_line):
buf = '' # 緩存每次讀取的數(shù)據(jù)和 上一次讀取數(shù)據(jù)分隔符后的剩余數(shù)據(jù)
while True:
while new_line in buf: # 判斷分隔符是否出現(xiàn)在緩存數(shù)據(jù)中
pos = buf.index(new_line) # 找到分隔符的位置
yield buf[:pos]
buf = buf[pos + len(new_line):]
chunk = f.read(4096*10)
if not chunk: # 讀到了文件結(jié)尾
yield buf # yield最后一個(gè)分隔符后面的數(shù)據(jù)
break
buf += chunk
with open('test.txt', 'rb', encoding='utf-8') as f:
for line in my_readlines(f, '#'):
print(line)