2009-02-13 5 views
74

J'essaye de déterminer la meilleure manière de manipuler se débarrasser des nouvelles lignes en lisant dans les fichiers délimités de nouvelle ligne dans Python.Meilleure méthode pour lire les fichiers délimités par des lignes de nouvelle ligne en Python et supprimer les retours à la ligne?

Ce que j'ai trouvé est le code suivant, inclure le code throwaway à tester.

import os 

def getfile(filename,results): 
    f = open(filename) 
    filecontents = f.readlines() 
    for line in filecontents: 
    foo = line.strip('\n') 
    results.append(foo) 
    return results 

blahblah = [] 

getfile('/tmp/foo',blahblah) 

for x in blahblah: 
    print x 

Suggestions?

+0

ce que sur l'utilisation de split ("/ n")? – jle

+1

Idem: http://stackoverflow.com/questions/339537/end-line-characters-from-lines-read-from-text-file-using-python –

+0

Je pense qu'il vaudrait mieux fermer le fichier aussi –

Répondre

179
lines = open(filename).read().splitlines() 
+0

Cette réponse fait ce que j'allais faire, je suis sûr que je vais devoir ajouter quelques vérifications d'erreurs et autres, mais pour ce besoin spécifique, c'est génial. Merci à tous pour vos réponses! – solarce

+0

J'aime ça, mais comment fermez-vous le fichier si vous ne sauvegardez pas le handle de fichier? Ou est-il automatiquement fermé? –

+6

Avec CPython, le nombre de références pour l'objet fichier sera nul une fois qu'il ne sera plus utilisé et le fichier sera automatiquement fermé. Pour les implémentations purement GC'd comme Jython et IronPython, le fichier ne peut pas être fermé avant l'exécution du GC - donc cette variation laconique peut ne pas être optimale. –

8
for line in file('/tmp/foo'): 
    print line.strip('\n') 
+0

Cela a fonctionné parfaitement. Fonctionne pour les fichiers plus gros aussi. –

2

Je ferais comme ça:

f = open('test.txt') 
l = [l for l in f.readlines() if l.strip()] 
f.close() 
print l 
+0

Bien que la réponse de Curt Hagenlocher soit techniquement meilleure, cette réponse est un bon point de départ si vous devez ajouter d'autres traitements à chaque ligne. – TomOnTime

+0

Je ne sais pas si c'était destiné à filtrer les lignes vides, mais c'est plus concis que ... si l.strip() n'est pas '' ', ce dont j'ai besoin dans mon cas. –

20

est ici un générateur qui fait ce que vous avez demandé. Dans ce cas, l'utilisation de rstrip est suffisante et légèrement plus rapide que la bande.

lines = (line.rstrip('\n') for line in open(filename)) 

Toutefois, vous souhaiterez probablement l'utiliser pour vous débarrasser également des espaces de fin.

lines = (line.rstrip() for line in open(filename)) 
+0

Ce ne devrait pas être [] autour du RHS, pas()? – andrewb

+7

@andrewb L'utilisation de() donne une expression de générateur, qui n'utilise pas autant de mémoire que l'utilisation de [] (une compréhension de liste.) –

3

J'utilise cette

def cleaned(aFile): 
    for line in aFile: 
     yield line.strip() 

Ensuite, je peux faire des choses comme ça.

lines = list(cleaned(open("file","r"))) 

Ou, je peux étendons nettoyé avec des fonctions supplémentaires, par exemple, déposer des lignes vides ou sauter des lignes de commentaires ou autre chose.

4

Il suffit d'utiliser les expressions du générateur:

blahblah = (l.rstrip() for l in open(filename)) 
for x in blahblah: 
    print x 

aussi je veux vous déconseiller la lecture de fichier entier en mémoire - en boucle sur des générateurs est beaucoup plus efficace sur les grands ensembles de données.

8

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