2011-09-26 15 views
5

mi sembra di ottenere risultati diversi:StringIO con file binari?

from StringIO import * 

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

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

Perché? È perché StringIO supporta solo stringhe di testo o qualcosa del genere?

+2

con quel codice, il secondo file.read() non otterrebbe nulla. Dovresti usare seek (0) prima di leggere di nuovo il file. –

risposta

8

Quando si chiama file.read(), leggerà l'intero file in memoria. Quindi, se chiami di nuovo file.read() sullo stesso oggetto file, avrà già raggiunto la fine del file, quindi restituirà solo una stringa vuota.

Invece, prova ad es. riaprire il file:

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() 

È inoltre possibile utilizzare l'istruzione with per far sì che più pulito il codice:

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() 

Per inciso, mi sento di raccomandare l'apertura dei file binari in modo binario: open('1.bmp', 'rb')

+0

Sì, hai ragione. Questo non ha risolto completamente il mio problema del mondo reale, quindi ho capito che stavo scrivendo i dati in modalità "w" e ottenendo file corrotti, non "wb". Ora tutto funziona :) – Joelmc

+0

Penso che file.seek (0), proposto da Minhee, sia un approccio molto migliore. – Gallaecio

-1

Non dovresti usare "rb" per aprire, invece di solo "r", dato che questa modalità presuppone che stai elaborando solo caratteri ASCII ed EOF?

+0

Su alcune piattaforme (e ovunque su Python 3) solo 'r' significa modalità binaria. Inoltre, per favore non aggiungere taglines/firme ai tuoi post. – agf

5

Il secondo file.read() restituisce effettivamente solo una stringa vuota. È necessario eseguire file.seek(0) per riavvolgere l'offset del file interno.