write paths open another address python file-io separator platform-independent

python - paths - ¿Para qué sirve os.linesep?



python file address (2)

Los documentos dicen explícitamente que no se debe usar al escribir en un archivo.

Esto no es exacto, el documento dice que no lo use en modo texto .

El os.linesep se utiliza cuando desea recorrer en iteración las líneas de un archivo de texto. El escáner interno reconoce el os.linesep y lo reemplaza por un solo "/ n".

Para ilustrar, escribimos un archivo binario que contiene 3 líneas separadas por "/ r / n" (delimitador de Windows):

import io filename = "text.txt" content = b''line1/r/nline2/r/nline3'' with io.open(filename, mode="wb") as fd: fd.write(content)

El contenido del archivo binario es:

with io.open(filename, mode="rb") as fd: for line in fd: print(repr(line))

NB: usé el modo "rb" para leer el archivo como un archivo binario.

Yo obtengo:

b''line1/r/n'' b''line2/r/n'' b''line3''

Si leo el contenido del archivo usando el modo de texto, así:

with io.open(filename, mode="r", encoding="ascii") as fd: for line in fd: print(repr(line))

Yo obtengo:

''line1/n'' ''line2/n'' ''line3''

El delimitador se sustituye por "/ n".

El os.linesep también se usa en el modo de escritura: cualquier carácter "/ n" se convierte al separador de línea predeterminado del sistema: "/ r / n" en Windows, "/ n" en POSIX, etc.

Con la función io.open puede forzar el separador de línea a lo que desee.

Ejemplo: cómo escribir un archivo de texto de Windows:

with io.open(filename, mode="w", encoding="ascii", newline="/r/n") as fd: fd.write("one/ntwo/nthree/n")

Si lees este archivo en modo de texto como este:

with io.open(filename, mode="rb") as fd: content = fd.read() print(repr(content))

Usted obtiene:

b''one/r/ntwo/r/nthree/r/n''

El módulo os de Python contiene un valor para una cadena que separa la línea específica de la plataforma, pero los documentos dicen explícitamente que no se debe usar al escribir en un archivo:

No use os.linesep como terminador de línea al escribir archivos abiertos en modo de texto (el valor predeterminado); use un solo ''/ n'' en su lugar, en todas las plataformas.

Docs

Las preguntas anteriores han explorado por qué no debería usarlo en este contexto, pero entonces, ¿para qué contexto es útil? ¿Cuándo debería usar el separador de línea y para qué?


Como ya sabe, leer y escribir archivos en modo texto en python convierte el separador de línea específico de la plataforma a ''/ n'' y viceversa. Pero si lee un archivo en modo binario, no se realiza ninguna conversión. Luego puede convertir explícitamente los finales de línea utilizando string.replace(os.linesep, ''/n'') . Esto puede ser útil si un archivo (o secuencia o lo que sea) contiene una combinación de datos binarios y de texto.