2012-01-30 102 views
6

下面的代碼,在Windows在Python 2.7.2 執行,只讀取底層文件的一小部分:Python:文件不會讀取整個文件,io.FileIO會 - 爲什麼?

import os 

in_file = open(os.path.join(settings.BASEPATH,'CompanyName.docx')) 
incontent = in_file.read() 
in_file.close() 

而此代碼的工作就好了:

import io 
import os 

in_file = io.FileIO(os.path.join(settings.BASEPATH,'CompanyName.docx')) 
incontent = in_file.read() 
in_file.close() 

爲什麼區別?從我閱讀的文檔中,他們應該表現一致。

+0

可能與編碼有關,可能是你打開文件的默認設置,open()默認爲'r',嘗試打開(文件名,'rb')強制二進制模式。 – synthesizerpatel 2012-01-30 18:44:05

回答

12

您需要以二進制模式打開文件,或者read()將停在它找到的第一個EOF字符處。而docx是一個ZIP文件,它保證在某處包含這樣的字符。

嘗試

in_file = open(os.path.join(settings.BASEPATH,'CompanyName.docx'), "rb") 

FileIO讀取raw bytestreams,而這些都是在默認情況下 「二進制」。

+0

哇!這是Windows處理文件方式的根本原因嗎? – Marcin 2012-01-30 18:46:44

+0

@Marcin更多關於MS Word docx文件格式。如果你只是想讀一個.txt,'open()'就可以正常工作。 – 2012-01-30 18:51:00

+3

+1。作爲Python 2.7文檔,[7.2。 *讀寫文件*],比如說:「Windows上的Python區分了文本和二進制文件;當讀取或寫入數據時,文本文件中的行尾字符會自動改變,這種幕後修改...... [將] ...像'JPEG'或'EXE'文件中那樣損壞二進制數據在讀寫這些文件時要非常小心地使用二進制模式在Unix上,追加一個''b'到模式,所以你可以使用它平臺獨立的所有二進制文件。「 – 2012-01-30 18:51:08