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中不保留關閉文件,並只讀一遍呢?
這是一個奇怪的輸出。首先,你甚至不會增加'count',那些'print'命令如何打印'1','2','3'等?其次,Python 2.7 docs明確指出,當read()被調用時沒有參數時,它會讀取整個文件(https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file -objects)。你確定你顯示的代碼是實際執行的代碼嗎? – lucasnadalutti
一些操作系統,如Windows,處理讀取文本文件與二進制文件不同。例如,他們處理換行符的方式。 Windows文本文件也可以在其中包含EOF(文件結束)字符。它看起來像你的代碼正在默認文本模式下讀取文件。嘗試以''開放(文件名,'rb')作爲二進制模式打開文件爲f:' – martineau
您需要以二進制模式打開文件。當你不在模式下包含'b'時,python會改變文件的內容,可能插入一個EOF或換行符。 –