txt texto partir lista leer importar gestion espaƱol ejercicios crear como binarios archivos archivo python file-io text-parsing

texto - leer archivo txt python 3



Diferencia entre analizar un archivo de texto en el modo r y rb (4)

Esto depende un poco de la versión de Python que estés usando. En Python 2, se aplica la respuesta de Chris Drappier .

En Python 3, es una historia diferente (y más consistente): en el modo de texto ( ''r'' ), Python analizará el archivo de acuerdo con la codificación de texto que le proporcione (o, si no proporciona una, una plataforma) dependiente predeterminado), y read() le dará un str . En el modo binario ( ''rb'' ), Python no supone que el archivo contiene elementos que pueden analizarse razonablemente como caracteres, y read() le proporciona un objeto de bytes .

Además, en Python 3, las nuevas líneas universales (la traducción entre ''/n'' y convenciones de nueva línea específicas de la plataforma para que no tenga que preocuparse por ellas) está disponible para archivos en modo texto en cualquier plataforma, no solo en Windows.

¿Qué hace que analizar un archivo de texto en el modo ''r'' sea más conveniente que analizarlo en modo ''rb''? Especialmente cuando el archivo de texto en cuestión puede contener caracteres que no sean ASCII.


La diferencia radica en cómo se maneja el fin de línea (EOL). Diferentes sistemas operativos utilizan diferentes caracteres para marcar EOL - /n en Unix, /r en versiones de Mac anteriores a OS X, /r/n en Windows. Cuando se abre un archivo en modo texto, cuando se lee el archivo, Python reemplaza el carácter de final de línea específico del sistema operativo leído del archivo con solo /n . Y viceversa, es decir, cuando intenta escribir /n en un archivo abierto en modo texto, va a escribir el carácter EOL específico del sistema operativo. Puede encontrar la EOL predeterminada de su sistema operativo marcando os.linesep .

Cuando se abre un archivo en modo binario, no se realiza ninguna asignación. Lo que lees es lo que obtienes. Recuerde, el modo de texto es el modo predeterminado. Entonces, si está manejando archivos que no son de texto (imágenes, video, etc.), asegúrese de abrir el archivo en modo binario, de lo contrario terminará descomponiendo el archivo al introducir (o eliminar) algunos bytes.

Python también tiene un modo de nueva línea universal. Cuando se abre un archivo en este modo, Python mapea todos los caracteres /r , /n y /r/n a /n .


Para aclarar y responder el comentario / pregunta de Agostino (no tengo suficiente reputación para comentar, tengan paciencia y digan esto como una respuesta ...):

En Python 2 no ocurre ninguna modificación en el final de línea, ni en texto ni en modo binario, como se dijo anteriormente, en Python 2 se aplica la respuesta de Chris Drappier (tenga en cuenta que su enlace apunta a los documentos Python 3.x pero el texto citado de Chris es por supuesto, desde el tutorial de entrada y salida de Python 2 )

Así que no, no es cierto que al abrir un archivo en modo texto con Python 2 en un sistema que no es de Windows, se produzca alguna modificación en el final de línea:

0 $ cat data.txt line1 line2 line3 0 $ file data.txt data.txt: ASCII text, with CRLF line terminators 0 $ python2.7 -c ''f = open("data.txt"); print f.readlines()'' [''line1/r/n'', ''line2/r/n'', ''line3/r/n''] 0 $ python2.7 -c ''f = open("data.txt", "r"); print f.readlines()'' [''line1/r/n'', ''line2/r/n'', ''line3/r/n''] 0 $ python2.7 -c ''f = open("data.txt", "rb"); print f.readlines()''

Sin embargo, es posible abrir el archivo en modo de nueva línea universal en Python 2, que realiza exactamente dicho mod final de línea:

0 $ python2.7 -c ''f = open("data.txt", "rU"); print f.readlines()'' [''line1/n'', ''line2/n'', ''line3/n'']

(el especificador de modo de nueva línea universal está en desuso a partir de Python 3.x)

En Python 3, por otra parte, los extremos de línea específicos de la plataforma se normalizan a ''/ n'' cuando se lee un archivo en modo texto, y ''/ n'' se convierte al final de línea predeterminado de la plataforma actual al escribir en modo texto ( además de la descodificación / codificación de bytes <-> unicode <-> bytes en modo texto). Por ejemplo, leer un archivo Dos / Win CRLF finalizado en Linux normalizará los extremos de la línea a ''/ n''.


de la documentation :

En Windows, ''b'' agregado 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 automáticamente cuando se leen o escriben los datos. Esta modificación entre bastidores de los datos de archivos está bien para los archivos de texto ASCII, pero dañará los datos binarios de esa manera en los archivos JPEG o EXE. Tenga mucho cuidado de usar el modo binario al leer y escribir dichos archivos. En Unix, no está de más agregar una ''b'' al modo, por lo que puedes usarla independientemente de la plataforma para todos los archivos binarios.