2013-10-16 80 views
1

如何從文件末尾的DESC文件中讀取文件? 例如從頭讀取Python文件,這是一個大文件,無法讀入內存

文件名:測試

內容:

11111111 
22222222 
333333333 

fp = open('test', 'r') 
print fp.readline 

333333333 
22222222 
11111111 

它是一個大的文件,我不想出閱讀所有內容。

+0

谷歌能比我快可以鍵入出來 –

+0

作爲@JustinJasmann指出找到這個答案,谷歌是你的朋友。 LMGTFY:http://stackoverflow.com/questions/3568833/how-to-read-lines-from-a-file-in-python-starting-from-the-end – Hyperboreus

+0

你有多少內存?如果文件適合內存,只需執行'lines = list(fp); lines.reverse()'。 –

回答

0
for x in open(r'C:\test.txt').readlines()[::-1]: 
    print x 
+0

這是一個大文件,我不想讀取所有內容。 – Anakin

1

而是從相對tidious過程結束讀線,

你可以使用逆轉()函數如下..

with open(filename, 'r') as fheader: 
    for line in reversed(fheader.readlines()): 
     print line 

希望這有助於:)

0

就在幾個月前我們討論了China Python User Group中的同樣的問題。一些答案從我們的討論中複製而來。

無論您選擇哪種解決方案,基本都是一樣的:尋找文件末尾,讀取數據塊,找到最後一行斷路器(\ r \ n或\ n),獲取最後一行,向後尋求,並一次又一次地做同樣的事情。

您可以嘗試使用tail -n對文件進行預處理,它效率很高(用C實現)並專爲此作業而設計。 如果你想自己實現它,請檢查它的source code

或致電在Python相同的命令:

from subprocess import Popen, PIPE 
txt = Popen(['tail', '-n%d' % n, filename], stdout=PIPE).communitate()[0] 
;) 

,或者嘗試使用純Python的解決方案:

def last_lines(filename, lines = 1): 
    #print the last several line(s) of a text file 
    """ 
    Argument filename is the name of the file to print. 
    Argument lines is the number of lines to print from last. 
    """ 
    block_size = 1024 
    block = '' 
    nl_count = 0 
    start = 0 
    fsock = file(filename, 'rU') 
    try: 
     #seek to end 
     fsock.seek(0, 2) 
     #get seek position 
     curpos = fsock.tell() 
     while(curpos > 0): #while not BOF 
      #seek ahead block_size+the length of last read block 
      curpos -= (block_size + len(block)); 
      if curpos < 0: curpos = 0 
      fsock.seek(curpos) 
      #read to end 
      block = fsock.read() 
      nl_count = block.count('\n') 
      #if read enough(more) 
      if nl_count >= lines: break 
     #get the exact start position 
     for n in range(nl_count-lines+1): 
      start = block.find('\n', start)+1 
    finally:   
     fsock.close() 
    #print it out 
    print block[start:] 

if __name__ == '__main__': 
    import sys 
    last_lines(sys.argv[0], 5) #print the last 5 lines of THIS file