2011-11-24 10 views
5

Voglio leggere un file e scriverlo di nuovo. Ecco il mio codice:Leggere un zip e scriverlo su un altro file python

file = open(zipname , 'r') 
    content = file.read() 
    file.close() 

    alt = open('x.zip', 'w') 
    alt.write(content) 
    alt.close() 

Questo non funziona, perché ?????

Edit:

Il file è corrotto riscritto (Python 2.7.1 su Windows)

risposta

9

Lettura e scrittura in modalità binaria, 'rb' e 'wb':

f = open(zipname , 'rb') 
content = f.read() 
f.close() 

alt = open('x.zip', 'wb') 
alt.write(content) 
alt.close() 

Il motivo per cui la modalità testo non ha funzionato su Windows è che la traduzione di nuova riga da '\ r \ n' a '\ r' ha distrutto i dati binari nel file zip.

+1

Grazie per questo, mi ha fatto impazzire quando ho provato a caricare un file zip su Dropbox (su Windows, OSX andava bene). –

1

Se eseguo questo programma sulla mia macchina OS X o Linux, funziona esattamente come ci si aspetterebbe. Il file x.zip ha esattamente lo stesso checksum del file zip originale e non è corrotto. Credo che Windows sia una delle piattaforme in cui è necessario aprire esplicitamente i file in modalità binaria; Prova:

file = open(zipname, 'rb') 
6

Da this bit of the manual:

In Windows, 'b' aggiunto alla modalità apre il file in modalità binaria, quindi ci sono modalità anche come 'rb', 'wb', e 'r + b'. Python su Windows distingue tra testo e file binari; i caratteri di fine riga nei file di testo vengono automaticamente modificati leggermente quando i dati vengono letti o scritti. Questa modifica dietro le quinte dei dati di file va bene per i file di testo ASCII, ma corromperà dati binari come quello in file JPEG o EXE. Prestare molta attenzione all'utilizzo della modalità binaria durante la lettura di e alla scrittura di tali file. Su Unix, non fa male aggiungere una "b" alla modalità , quindi puoi usarla indipendentemente dalla piattaforma per tutti i file binari .

+1

+1 per il riferimento di alta qualità :-) –

+2

Diventa ancora peggio con Python 3. In Python 3 le codifiche vengono applicate in lettura/scrittura e tutte le stringhe sono Unicode. In parole povere: molto più che solo le terminazioni di linea possono cambiare, e su tutte le piattaforme. Ciò significa che gli utenti devono contrassegnare i file quando sono binari su tutte le piattaforme o avranno un tempo di porting molto più difficile per Python 3. – yam655

Problemi correlati