88 votes

Meilleure méthode pour lire des fichiers délimités par des sauts de ligne et supprimer les sauts de ligne?

Je suis en train de chercher la meilleure façon de traiter la suppression des sauts de ligne lors de la lecture de fichiers délimités par des sauts de ligne en Python.

Ce que j'ai élaboré est le code suivant, incluant un code jetable pour 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

0 votes

Que diriez-vous d'utiliser split("/n")?

1 votes

0 votes

Je pense qu'il serait préférable de fermer le fichier également

207voto

Curt Hagenlocher Points 12432
lines = open(filename).read().splitlines()

1 votes

Cette réponse fait ce que je voulais, je suis sûr que je devrai ajouter quelques vérifications d'erreur et autres, mais pour ce besoin spécifique, c'est super. Merci à tous pour avoir fourni des réponses!

0 votes

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

6 votes

Avec CPython, le compte de référence pour l'objet fichier passera à zéro une fois qu'il n'est plus utilisé et le fichier sera automatiquement fermé. Pour les implémentations purement GC comme Jython et IronPython, le fichier peut ne pas être fermé tant que le GC n'a pas été exécuté - donc cette variation concise peut ne pas être optimale.

24voto

TimoLinna Points 161

Voici 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 strip.

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

Cependant, vous voudrez probablement l'utiliser pour vous débarrasser des espaces blancs finaux également.

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

0 votes

Ne faudrait-il pas mettre [] autour du RHS, et non pas ()?

8 votes

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

13voto

Paweł Prażak Points 1054

Que pensez-vous de cette approche?

with open(filename) as data:
    datalines = (line.rstrip('\r\n') for line in data)
    for line in datalines:
        ...faites quelque chose de génial...

L'expression de génération évite de charger tout le fichier en mémoire et with assure la fermeture du fichier

0 votes

C'est essentiellement la même chose que la réponse de @TimoLinna publiée des années auparavant...

8voto

David Z Points 49476
for line in file('/tmp/foo'):
    print line.strip('\n')

4voto

Il suffit d'utiliser des expressions de générateur :

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

Je tiens également à vous conseiller de ne pas lire tout le fichier en mémoire -- parcourir des générateurs est beaucoup plus efficace sur de gros ensembles de données.

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