2012-01-30 15 views
6

Poniższy kod, wykonany w python 2.7.2 na oknach, czyta tylko w ułamku pliku bazowego:Python: Plik nie czyta całego pliku, io.FileIO robi - dlaczego?

import os 

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

gdy ten kod działa dobrze:

import io 
import os 

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

Dlaczego różnica? Z mojego czytania dokumentów, powinny one działać identycznie.

+0

Może to być związane z kodowaniem, może być, że otwierasz plik z ustawieniami domyślnymi, open() domyślnie po prostu "r", spróbuj otworzyć (nazwa pliku, "rb"), aby wymusić tryb binarny. – synthesizerpatel

Odpowiedz

12

Musisz otworzyć plik w trybie binarnym lub read() zatrzyma się na pierwszym znalezionym znaku EOF. I docx to plik ZIP, który z pewnością zawiera gdzieś taką postać.

Spróbuj

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

FileIO czyta raw bytestreams a te są "binarny" domyślnie.

+0

Wow! Czy podstawowa przyczyna tego jest fundamentalna w sposobie obsługiwania plików przez system Windows? – Marcin

+0

@Marcin to więcej informacji na temat formatu pliku docx MS Word. jeśli chcesz tylko czytać .txt, 'open()' będzie działało dobrze. –

+3

+1. Jak mówi Python 2.7, [7.2. * Czytanie i zapisywanie plików *], powiedz: "Python w systemie Windows rozróżnia tekst i pliki binarne, znaki końca linii w plikach tekstowych są automatycznie modyfikowane nieznacznie podczas odczytu lub zapisu danych. modyfikacja ... [będzie] ... uszkodzone dane binarne, takie jak te w plikach "JPEG" lub "EXE" .Bądź bardzo ostrożny, aby korzystać z trybu binarnego podczas czytania i pisania takich plików. W systemie Unix nie zaszkodzi dołączyć '' b'' do trybu, dzięki czemu można go używać niezależnie od platformy dla wszystkich plików binarnych. " –

Powiązane problemy