520 votes

Comment lire un fichier sans sauts de ligne ?

En Python, appeler par exemple temp = open(filename,'r').readlines() donne une liste dans laquelle chaque élément est une ligne du fichier. Cependant, ces chaînes de caractères ont un caractère de saut de ligne à la fin, que je ne veux pas.

Comment puis-je obtenir les données sans les sauts de ligne ?

4 votes

Utilisez strip : [l.strip('\n\r') for l in temp]. Ou même rstrip. Et comme il y a une itération ici, cela peut être in open au lieu de in temp.

17 votes

Ce serait bien si en Python 3 il y avait une valeur pour définir l'argument newline de la fonction open sur le retrait des nouvelles lignes en fin de fichier.

0 votes

764voto

Bakuriu Points 22607

Vous pouvez lire le fichier entier et diviser les lignes en utilisant str.splitlines:

temp = file.read().splitlines()

Ou vous pouvez supprimer le saut de ligne manuellement :

temp = [line[:-1] for line in file]

Note : cette dernière solution ne fonctionne que si le fichier se termine par un saut de ligne, sinon la dernière ligne perd un caractère.

Cette hypothèse est vraie dans la plupart des cas (surtout pour les fichiers créés par des éditeurs de texte, qui ajoutent souvent un saut de ligne de toute façon).

Si vous souhaitez éviter cela, vous pouvez ajouter un saut de ligne à la fin du fichier :

with open(the_file, 'r+') as f:
    f.seek(-1, 2)  # aller à la fin du fichier
    if f.read(1) != '\n':
        # ajouter un saut de ligne manquant s'il n'est pas déjà présent
        f.write('\n')
        f.flush()
        f.seek(0)
    lines = [line[:-1] for line in f]

Ou une alternative plus simple est de strip le saut de ligne à la place :

[line.rstrip('\n') for line in file]

Ou même, bien que assez illisible :

[line[:-(line[-1] == '\n') or len(line)+1] for line in file]

Ceci exploite le fait que la valeur de retour de or n'est pas un booléen, mais l'objet qui a été évalué comme vrai ou faux.


La méthode readlines est en fait équivalente à :

def readlines(self):
    lines = []
    for line in iter(self.readline, ''):
        lines.append(line)
    return lines

# ou de manière équivalente

def readlines(self):
    lines = []
    while True:
        line = self.readline()
        if not line:
            break
        lines.append(line)
    return lines

Étant donné que readline() garde le saut de ligne, readlines() le garde également.

Note : pour la symétrie avec readlines(), la méthode writelines() n'ajoute pas de sauts de ligne à la fin, ainsi f2.writelines(f.readlines()) produira une copie exacte de f dans f2.

2 votes

Notez que [line.rstrip('\n') for line in file] supprimera plus d'un \n en fin de ligne.

1 votes

Plus simplement, [ligne[:-(ligne[-1] == '\n') or len(ligne)+1] for ligne in fichier] pourrait être remplacé par [ligne[:-(ligne[-1] == '\n') or Aucun] for ligne in fichier].

15 votes

Ces solutions lisent tout le fichier en mémoire. Changer les crochets carrés d'une compréhension de liste en parenthèses crée une expression de générateur qui vous permet d'itérer sur le fichier une ligne à la fois : for line in (x.strip() for x in f):

62voto

vivek Points 1333
temp = open(filename,'r').read().split('\n')

14 votes

Que se passerait-il avec les sauts de ligne \r\n alors? ;)

0 votes

@WoLpH Oui, je n'ai pas pris en compte les sauts de ligne spécifiques à la plateforme. Cela donnera la mauvaise chose.

34 votes

Python gère automatiquement les nouvelles lignes universelles, ainsi .split('\n') se séparera correctement, indépendamment de la convention de nouvelle ligne. Cela importerait si vous lisiez le fichier en mode binaire. Dans ce cas, splitlines() traite les nouvelles lignes universelles tandis que split('\n') ne le fait pas.

37voto

O95 Points 477

Lire le fichier une ligne à la fois. Supprimer les caractères indésirables à la fin de la chaîne avec str.rstrip(chars).

with open(filename, 'r') as fileobj:
    for row in fileobj:
        print(row.rstrip('\n'))

Voir aussi str.strip([chars]) et str.lstrip([chars]).

26voto

RENZO Points 175

Je pense que c'est la meilleure option.

temp = [line.strip() for line in file.readlines()]

14voto

temp = open(filename,'r').read().splitlines()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X