2016-12-02 34 views
3

我試圖讀取包含ASCII標頭和二進制數據段的文件,但Python解釋器似乎提前關閉了文件(即文件到達之前)。這裏是我的代碼,在Python開發2.7.12:腳本在文件結束之前終止讀取

fileSize = os.path.getsize(filename) # file size in bytes 
bytesRead = 0L 
content = [] 
with open(filename,'r') as f: 
    content = f.read() 
    bytesRead += sys.getsizeof(content) 

print 'File size:',fileSize 
print 'Total read:',bytesRead 

但是,文件過早閉合後圍繞文件的總77MB的1MB已經閱讀。

print 'File size:',fileSize 
print 'Total read:',bytesRead 

生產:File size: 76658457, Total read: 1165436

它離開二進制區段中的一個內。我moified原來的程序反覆重新打開,從它被關閉的點的文件,內容如下:

fileSize = os.path.getsize(filename) # file size in bytes 
bytesRead = 0L 
content = [] 

try: 
    while True: 
     count += 1 
     with open(filename,'r') as f: 
      f.seek(bytesRead+1) 
      newContent = f.read() 
      content.append(newContent) 
      bytesRead += sys.getsizeof(newContent) 
      print count,' Total read:',bytesRead 
except Exception,e: 
    print e 

print 'File size:',fileSize 
print '% read = ',bytesRead*100./float(fileSize) 
print 'count: ',count 

這給:

1 Total read: 1165436 
2 Total read: 1180218 
3 Total read: 1181902 

... [many more iterations] ... 

25564 Total read: 77925641 
25567 Total read: 77926615 
25568 Total read:Exception: I/O operation on closed file 

File size: 76658457 
% read = 101.65429721603 
count: 25568 

任何想法,我怎麼才能說服Python中不保留關閉文件,並只讀一遍呢?

+0

這是一個奇怪的輸出。首先,你甚至不會增加'count',那些'print'命令如何打印'1','2','3'等?其次,Python 2.7 docs明確指出,當read()被調用時沒有參數時,它會讀取整個文件(https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file -objects)。你確定你顯示的代碼是實際執行的代碼嗎? – lucasnadalutti

+3

一些操作系統,如Windows,處理讀取文本文件與二進制文件不同。例如,他們處理換行符的方式。 Windows文本文件也可以在其中包含EOF(文件結束)字符。它看起來像你的代碼正在默認文本模式下讀取文件。嘗試以''開放(文件名,'rb')作爲二進制模式打開文件爲f:' – martineau

+3

您需要以二進制模式打開文件。當你不在模式下包含'b'時,python會改變文件的內容,可能插入一個EOF或換行符。 –

回答

0

我相信會發生的是您正在檢查字節大小,而不是數組中的實際數據。檢查數組的最後一行,然後檢查文件的最後一行,它很可能會揭示它實際上正在讀取整個文件的事實

相關問題