2011-11-24 21 views
5

Quiero leer un archivo y volver a escribirlo. Aquí está mi código:Leer un archivo zip y escribirlo en otro archivo python

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

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

Esto no funciona, ¿por qué ?????

Editar:

El archivo es corrupto reescrito (Python 2.7.1 en Windows)

Respuesta

9

leer y escribir en el modo binario, 'rb' y 'wb':

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

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

La razón por la que el modo de texto no funcionaba en Windows es que la nueva traducción de '\ r \ n' a '\ r' destrozó los datos binarios en el archivo zip.

+1

Gracias por esto, me volvieron loco al intentar cargar un archivo Zip a Dropbox (en Windows, OSX estaba bien). –

1

Si ejecuto este programa en mi caja OS X o Linux, funciona exactamente como era de esperar. El archivo x.zip tiene exactamente la misma suma de comprobación que el archivo zip original y no está dañado. Creo que Windows es una de las plataformas donde necesitas abrir archivos explícitamente en modo binario; Proveedores:

file = open(zipname, 'rb') 
6

De this bit of the manual:

En Windows, 'b' anexa al modo se abre el archivo en modo binario, por lo también hay modos como 'rb', 'wb', y 'r + b'. Python en Windows hace una distinción entre archivos de texto y binarios; los caracteres de final de línea en los archivos de texto se modifican automáticamente cuando se leen o escriben los datos . Esta modificación entre bastidores de los datos de archivo está bien para los archivos de texto ASCII, pero dañará datos binarios como el en archivos JPEG o EXE. Tenga mucho cuidado al usar el modo binario cuando lea y escriba dichos archivos. En Unix, no está de más añadir "b" a el modo, por lo que puede usarlo independientemente de la plataforma para todos los archivos binarios .

+1

+1 para la referencia de alta calidad :-) –

+2

Se pone aún peor con Python 3. En Python 3 las codificaciones se aplican en tiempo de lectura/escritura y todas las cadenas son Unicode. En lenguaje simple: Mucho más que solo los finales de línea pueden cambiar, y en todas las plataformas. Esto significa que las personas necesitan marcar los archivos cuando son binarios en todas las plataformas o tendrán mucho más dificultades para migrar a Python 3. – yam655

Cuestiones relacionadas