如果直接對(duì)大文件對(duì)象調(diào)用 read() 方法,會(huì)導(dǎo)致不可預(yù)測(cè)的內(nèi)存占用。好的方法是利用固定長(zhǎng)度的緩沖區(qū)來不斷讀取文件內(nèi)容。即通過yield。
??? 在用Python讀一個(gè)兩個(gè)多G的txt文本時(shí),天真的直接用readlines方法,結(jié)果一運(yùn)行內(nèi)存就崩了。
??? 還好同事點(diǎn)撥了下,用yield方法,測(cè)試了下果然毫無壓力。咎其原因,原來是readlines是把文本內(nèi)容全部放于內(nèi)存中,而yield則是類似于生成器。
代碼如下:
def open_txt(file_name): with open(file_name,'r+') as f: while True: line = f.readline() if not line: return yield line.strip()
調(diào)用實(shí)例:
for text in open_txt('aa.txt'): print text
例二:
目標(biāo) txt 文件大概有6G,想取出前面1000條數(shù)據(jù)保存于一個(gè)新的 txt 文件中做余下的操作,雖然不知道這樣做有沒有必要但還是先小數(shù)據(jù)量測(cè)試一下吧。參考這個(gè)帖子:我想把一個(gè)list列表保存到一個(gè)Txt文檔,該怎么保存 ,自己寫了一個(gè)簡(jiǎn)單的小程序。
====================================================
import datetime import pickle start = datetime.datetime.now() print "start--%s" % (start) fileHandle = open ( 'train.txt' ) file2 = open('s_train.txt','w') i = 1 while ( i < 10000 ): a = fileHandle.readline() file2.write(''.join(a)) i = i + 1 fileHandle.close() file2.close() print "done--%s" % ( datetime.datetime.now() - start) if __name__ == '__main__': pass
====================================================
pickle 這個(gè)庫(kù)大家說的很多,官網(wǎng)看看,后面可以好好學(xué)習(xí)一下。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
