2011-09-26 10 views
5

wydaje mi się, aby uzyskać różne wyjścia:StringIO z plikami binarnymi?

from StringIO import * 

file = open('1.bmp', 'r') 

print file.read(), '\n' 
print StringIO(file.read()).getvalue() 

Dlaczego? Czy to dlatego, że StringIO obsługuje tylko ciągi tekstowe czy coś takiego?

+2

z tym kodem, drugi plik.read() nie dostanie nic. Powinieneś użyć funkcji wyszukiwania (0) przed ponownym odczytaniem pliku. –

Odpowiedz

8

Po wywołaniu file.read(), odczyta cały plik do pamięci. Następnie, jeśli ponownie wywołasz file.read() na tym samym obiekcie pliku, osiągnie on już koniec pliku, więc zwróci tylko pusty ciąg.

Zamiast tego spróbuj np. ponownym otwarciu pliku:

from StringIO import * 

file = open('1.bmp', 'r') 
print file.read(), '\n' 
file.close() 

file2 = open('1.bmp', 'r') 
print StringIO(file2.read()).getvalue() 
file2.close() 

Można również użyć instrukcji with aby to czystsze kodu:

from StringIO import * 

with open('1.bmp', 'r') as file: 
    print file.read(), '\n' 

with open('1.bmp', 'r') as file2: 
    print StringIO(file2.read()).getvalue() 

Tak na marginesie, polecam otwierania plików binarnych w trybie binarnym: open('1.bmp', 'rb')

+0

Tak, masz rację. To nie rozwiązało całkowicie mojego problemu z prawdziwym światem, potem zorientowałem się, że piszę dane w trybie "w" i otrzymuję uszkodzone pliki, a nie "wb". Teraz wszystko działa :) – Joelmc

+0

Myślę, że file.seek (0), zaproponowany przez minhee, jest znacznie lepszym podejściem. – Gallaecio

-1

Nie powinieneś używać "rb" do otwierania, zamiast tylko "r", ponieważ ten tryb zakłada, że ​​będziesz przetwarzał tylko znaki ASCII i EOF?

+0

Na niektórych platformach (i wszędzie w Pythonie 3) tylko 'r' oznacza tryb binarny. Ponadto nie dodawaj sloganów/podpisów do swoich postów. – agf

5

Drugi file.read() faktycznie zwraca tylko pusty ciąg. Powinieneś wykonać file.seek(0), aby przewinąć wewnętrzne przesunięcie pliku.

Powiązane problemy