2008-12-04 10 views
26

Lors de la lecture des lignes à partir d'un fichier texte en utilisant python, le caractère de fin de ligne doit souvent être tronqué avant de traiter le texte, comme dans l'exemple suivant:caractères de fin de ligne à partir de lignes lues à partir du fichier texte, en utilisant Python

f = open("myFile.txt", "r") 
    for line in f: 
     line = line[:-1] 
     # do something with line 

Existe-t-il une manière élégante ou idiome pour récupérer des lignes de texte sans le caractère de fin de ligne?

Répondre

44

Le idiomatiques façon de le faire en Python est d'utiliser rstrip ('\ n'):

for line in open('myfile.txt'): # opened in text-mode; all EOLs are converted to '\n' 
    line = line.rstrip('\n') 
    process(line) 

Chacune des autres alternatives a une Gotcha:

  • file ('...'). read(). splitlines() doit charger le fichier entier en mémoire à la fois.
  • ligne = ligne [: - 1] échouera si la dernière ligne n'a pas EOL.
+15

Les protocoles HTTP et autres spécifient '\ r \ n' pour les fins de ligne, vous devriez donc utiliser line.rstrip ('\ r \ n') pour la robustesse. –

+0

Merci pour votre aide! J'avais besoin d 'ouvrir un fichier texte et j'ai été étonné de voir que la \ n - chose est même en Python comme en Perl, C et tant d' autres langages. Je marquerai ceci et ne l'oublierai jamais. – bjd2385

5

Quel est le problème avec votre code? Je trouve que c'est assez élégant et simple. Le seul problème est que si le fichier ne se termine pas par un saut de ligne, la dernière ligne renvoyée n'aura pas de '\n' comme dernier caractère, et donc line = line[:-1] déshabillera incorrectement le dernier caractère de la ligne.

La façon la plus élégante de résoudre ce problème serait de définir un générateur qui a pris les lignes du fichier et supprimé le dernier caractère de chaque ligne que si ce personnage est une nouvelle ligne:

def strip_trailing_newlines(file): 
    for line in file: 
     if line[-1] == '\n': 
      yield line[:-1] 
     else: 
      yield line 

f = open("myFile.txt", "r") 
for line in strip_trailing_newlines(f): 
    # do something with line 
+3

fichiers Mac en utilisant '\ r', Windows utilise \ r \ n ", il commence à faire trop épaisse. Il est préférable d'utiliser str.rstrip() –

+2

Si le fichier est ouvert en mode texte, les fins de ligne natives de la plate-forme sont automatiquement converties en un seul «\ n» au fur et à mesure de leur lecture. r '. Vous ne pouvez pas utiliser rstrip() si vous souhaitez conserver les espaces de fin et les onglets. –

+0

Bonne idée, avec le générateur. Serait utile dans une bibliothèque réutilisable. Je combinerais votre solution avec la solution d'efonitis (pour enregistrer le if: else :). Sans la bibliothèque réutilisable, je préférerais la solution d'efotinis (en utilisant line.rstrip ('\ n')). – pythonquick

17

simple. Utilisez pour enlever les espaces blancs à la fin de votre ligne ) (lignes de division

L = open("myFile.txt", "r").read().splitlines(); 
for line in L: 
    process(line) # this 'line' will not have '\n' character at the end 
+4

Mais notez que ceci charge d'abord le fichier entier en mémoire, ce qui peut le rendre inadapté à certaines situations. –

+0

@Matthew: Oui, vous avez raison. –

+1

le rend exactement exact pour moi, merci –

2

Vous pouvez également envisager d'utiliser line.rstrip().

+0

J'utilise aussi rstrip(), mais vous devez garder à l'esprit qu'il supprime également les espaces de fin et les onglets –

+0

Comme efotinis l'a montré, si vous spécifiez l'argument chars, vous pouvez specfy quoi à dépouiller. De la documentation: "" "rstrip ([chars]) L'argument chars est une chaîne spécifiant l'ensemble de caractères à supprimer Si omis ou None, l'argument chars par défaut supprime les espaces." "" – monkut

3

Il y a longtemps, il y avait Cher, code propre, vieux, BASIC qui pourrait fonctionner sur des machines de base 16 kb: comme ça:

if (not open(1,"file.txt")) error "Could not open 'file.txt' for reading" 
while(not eof(1)) 
    line input #1 a$ 
    print a$ 
wend 
close 

Maintenant, pour lire une ligne de fichiers en ligne, avec bien meilleur matériel et des logiciels (Python), il faut réinventer la roue:

def line_input (file): 
    for line in file: 
     if line[-1] == '\n': 
      yield line[:-1] 
     else: 
      yield line 

f = open("myFile.txt", "r") 
for line_input(f): 
    # do something with line 

Je suis à penser que induit quelque chose a quelque part dans le mauvais sens ...

+1

Tandis que, considérant que python est notre meilleure option pour un langage interprété d'entrée de gamme, je suis d'accord sur ce commentaire, il pourrait être commode de remarquer que 16kb BASIC avec une phrase WHILE n'étaient jamais communs. – arivero

3

Que pensez-vous de cette approche?

with open(filename) as data: 
    datalines = (line.rstrip('\r\n') for line in data) 
    for line in datalines: 
     ...do something awesome... 

expression du générateur évite le chargement de fichier en mémoire et with assure la fermeture du fichier

Questions connexes