También debería considerar usar en openlugar de file. fileestaba en desuso en Python 2 (no se pudo encontrar la versión) y se eliminó en py3k. (gracias Scott) Consulte esta pregunta para obtener más información.
No es realmente justo asumir que es el propio código del OP, especialmente dada la naturaleza de la pregunta. Obviamente, fue válido en un momento.
mckenzm
Respuestas:
112
Modo de archivo , escritura y binario. Dado que está escribiendo un archivo .jpg, se ve bien.
Pero si se supone que debe leer ese archivo jpg, debe usar 'rb'
Más información
En Windows, la 'b' agregada al modo abre el archivo en modo binario, por lo que 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 fin de línea en los archivos de texto se modifican ligeramente automáticamente cuando se leen o escriben datos. Esta modificación detrás de escena de los datos de archivo está bien para archivos de texto ASCII, pero dañará datos binarios como ese en archivos JPEG o EXE.
Concretamente, en Windows para un archivo abierto en modo texto, en fd.write("foo\n")realidad se escribe en el disco foo\r\n(tenga en cuenta el \r).
Serge Ballesta
4
Estoy bastante seguro de que 'b' abre archivos en modo binario en todas las plataformas, no solo en Windows o también habría una enorme advertencia aquí.
mckenzm
76
El wbindica que el archivo se abre para escribir en modo binario.
Al escribir en modo binario, Python no realiza cambios en los datos a medida que se escriben en el archivo. Sin embargo, en el modo de texto (cuando bse excluye como en just wo cuando especificas el modo de texto con wt), Python codificará el texto según la codificación de texto predeterminada. Además, Python convertirá los finales de línea ( \n) a cualquier final de línea específico de la plataforma, lo que dañaría un archivo binario como un archivo exeo png.
Por lo tanto, el modo de texto debe usarse al escribir archivos de texto (ya sea usando texto sin formato o un formato basado en texto como CSV), mientras que el modo binario debe usarse al escribir archivos que no son de texto como imágenes.
Esto puede haber cambiado con el tiempo. En Ubuntu 18.04 con Python 3.6.8, el 'modo binario' definitivamente importaba. Recibí un error al intentar escribir en un archivo de texto (formato CSV, no es que al final importe mucho) que se abrió con la wbopción. Al usar la wopción en su lugar, pude hacer que funcionara correctamente.
TheDavidJohnson
1
Gracias por tu comentario @TheDavidJohnson. De vuelta en Python 2.6, los documentos decían que el bmodo solo tenía un efecto en Windows. Eso ahora se ha eliminado de la documentación y el modo binario "debería usarse para todos los archivos que no contienen texto".
Daniel G
1
¡Seguro, @Daniel! Agradezco que publiques tu solución. Más de 9 años después, sigue siendo útil. ¿Qué tan bueno es eso? En cualquier caso, solo quería agregar información nueva para otros como yo que aún podrían venir y encontrar esto útil. ¡Salud!
TheDavidJohnson
Gran explicación Sin embargo, una aclaración: usted dice "Por lo tanto, el modo de texto debe usarse al escribir archivos de texto" . Para completar, me referiría a su comentario anterior de que "Python no hace cambios [en modo binario]", y agregaría que usaría el modo binario en un archivo de texto cuando no sepa (o no le importe) cuál es la codificación pero solo necesita leer o escribir los bytes, o si desea preservar los finales de línea independientemente de la plataforma.
pcdev
8
Ese es el modo con el que está abriendo el archivo. "wb" significa que está escribiendo en el archivo (w) y que está escribiendo en modo binario (b).
Consulte la documentación para obtener más información: clicky
open
lugar defile
.file
estaba en desuso en Python 2 (no se pudo encontrar la versión) y se eliminó en py3k. (gracias Scott) Consulte esta pregunta para obtener más información.open
lugar defile
, que quedó obsoleto en Python 2 y se eliminó en Python 3. Consulte stackoverflow.com/questions/112970/…Respuestas:
Modo de archivo , escritura y binario. Dado que está escribiendo un archivo .jpg, se ve bien.
Pero si se supone que debe leer ese archivo jpg, debe usar
'rb'
Más información
fuente
fd.write("foo\n")
realidad se escribe en el discofoo\r\n
(tenga en cuenta el\r
).El
wb
indica que el archivo se abre para escribir en modo binario.Al escribir en modo binario, Python no realiza cambios en los datos a medida que se escriben en el archivo. Sin embargo, en el modo de texto (cuando
b
se excluye como en justw
o cuando especificas el modo de texto conwt
), Python codificará el texto según la codificación de texto predeterminada. Además, Python convertirá los finales de línea (\n
) a cualquier final de línea específico de la plataforma, lo que dañaría un archivo binario como un archivoexe
opng
.Por lo tanto, el modo de texto debe usarse al escribir archivos de texto (ya sea usando texto sin formato o un formato basado en texto como CSV), mientras que el modo binario debe usarse al escribir archivos que no son de texto como imágenes.
Referencias:
https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files https://docs.python.org/3/library/functions.html#open
fuente
wb
opción. Al usar law
opción en su lugar, pude hacer que funcionara correctamente.b
modo solo tenía un efecto en Windows. Eso ahora se ha eliminado de la documentación y el modo binario "debería usarse para todos los archivos que no contienen texto".Ese es el modo con el que está abriendo el archivo. "wb" significa que está escribiendo en el archivo (w) y que está escribiendo en modo binario (b).
Consulte la documentación para obtener más información: clicky
fuente