web-dev-qa-db-fra.com

À quoi sert os.linesep?

Le module os de Python contient une valeur pour une chaîne de séparation de ligne spécifique à la plate-forme, mais les documents disent explicitement de ne pas l'utiliser lors de l'écriture dans un fichier:

N'utilisez pas os.linesep comme terminateur de ligne lors de l'écriture de fichiers ouverts en mode texte (par défaut); utilisez plutôt un seul\n sur toutes les plateformes.

Documents

Questions précédentes avez exploré pourquoi vous ne devriez pas l'utiliser dans ce contexte, mais dans quel contexte est-il utile? Quand faut-il utiliser le séparateur de lignes et pour quoi faire?

21
SuperBiasedMan

les documents disent explicitement de ne pas l'utiliser lors de l'écriture dans un fichier

Ce n'est pas exact, le doc dit de ne pas l'utiliser en mode text.

Le os.linesep est utilisé lorsque vous souhaitez parcourir les lignes d'un fichier texte. Le scanner interne reconnaît le os.linesep et remplacez-le par un seul "\ n".

Pour illustration, nous écrivons un fichier binaire qui contient 3 lignes séparées par "\ r\n" (délimiteur Windows):

import io

filename = "text.txt"

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

Le contenu du fichier binaire est:

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

NB: J'ai utilisé le mode "rb" pour lire le fichier sous forme de fichier binaire.

Je reçois:

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

Si je lis le contenu du fichier en utilisant le mode texte, comme ceci:

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

Je reçois:

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

Le délimiteur est remplacé par "\ n".

Le os.linesep est également utilisé en mode écriture: tout caractère "\ n" est converti dans le séparateur de ligne par défaut du système: "\ r\n" sous Windows, "\ n" sous POSIX, etc.

Avec le io.open fonction vous pouvez forcer le séparateur de ligne à ce que vous voulez.

Exemple: comment écrire un fichier texte Windows:

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

Si vous lisez ce fichier en mode texte comme ceci:

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

Vous obtenez:

b'one\r\ntwo\r\nthree\r\n'
13
Laurent LAPORTE

Comme vous le savez, la lecture et l'écriture de fichiers en mode texte en python convertit le séparateur de ligne spécifique à la plate-forme en '\ n' et vice versa. Mais si vous voulez lire un fichier en mode binaire, pas de conversion Vous pouvez ensuite convertir explicitement les fins de ligne à l'aide de string.replace(os.linesep, '\n'). Cela peut être utile si un fichier (ou un flux ou autre) contient une combinaison de données binaires et textuelles.

6
Rob