2016-06-28 55 views
14

modulo os di Python contiene un valore per una linea specifica piattaforma di separazione stringa, ma la documentazione esplicitamente dire non usarlo quando si scrive in un file:Per cosa è os.linesep?

Non utilizzare os.linesep come terminatore di linea durante la scrittura di file aperto in modalità testo (il valore predefinito); usa invece un singolo '\ n', su tutte le piattaforme.

Docs

Previous questions hanno esplorato il motivo per cui non si dovrebbe usarlo in questo contesto, ma poi quale contesto è utile per? Quando dovresti usare il separatore di linea e per cosa?

risposta

7

i documenti esplicitamente dicono di non usarlo quando si scrive in un file

Questo non è esatto, il dottore dice di non utilizzare in testo modalità.

Il os.linesep viene utilizzato quando si desidera ripetere le righe di un file di testo. Lo scanner interno riconosce lo os.linesep e lo sostituisce con un singolo "\ n".

Per illustrazione, scriviamo un file binario che contiene 3 linee separate da "\ r \ n" (delimitatore di Windows):

import io 

filename = "text.txt" 

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

Il contenuto del file binario è:

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

NB: Ho usato la modalità "rb" per leggere il file come file binario.

ottengo:

b'line1\r\n' 
b'line2\r\n' 
b'line3' 

Se ho letto il contenuto del file utilizzando la modalità di testo, in questo modo:

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

ottengo:

'line1\n' 
'line2\n' 
'line3' 

Il delimitatore è sostituito da "\ n".

Il os.linesep viene utilizzato anche in modalità di scrittura: qualsiasi carattere "\ n" è convertito al separatore di default del sistema riga: "\ r \ n" su Windows, "\ n", a POSIX, ecc

Con la funzione io.open è possibile forzare il separatore di linea in base alle proprie esigenze.

Esempio: come scrivere un file di Windows di testo:

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

Se stai leggendo questo file in modalità testo come questo:

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

si ottiene:

b'one\r\ntwo\r\nthree\r\n' 
4

Come sapete, la lettura e la scrittura di file in modalità testo in python converte il separatore di riga specifico della piattaforma in '\ n' e viceversa. Ma se si legge un file in modalità binaria, non avviene alcuna conversione. Quindi puoi convertire esplicitamente le terminazioni di linea usando string.replace(os.linesep, '\n'). Questo può essere utile se un file (o stream o altro) contiene una combinazione di dati binari e di testo.

+0

Si wouldn funziona se la codifica è ascii incompatibile. 'len ('\ n'.encode (' utf-16 '))' è 4 –