web-dev-qa-db-fra.com

Problème simple python/regex: supprimer toutes les nouvelles lignes d'un fichier

Je me familiarise avec python et je crée des problèmes pour pouvoir m'aider à apprendre les rouages ​​de la langue. Mon prochain problème vient comme suit:

J'ai copié et collé une énorme quantité de texte provenant d'Internet, mais le copier-coller a ajouté plusieurs nouvelles lignes pour rompre l'énorme chaîne. Je souhaite supprimer tous ces éléments par programmation et replacer la chaîne en une boule de caractères géante. C’est évidemment un travail pour regex (je pense), et analyser dans le fichier et supprimer toutes les occurrences du caractère de nouvelle ligne donne l’impression que cela fonctionnerait, mais cela ne semble pas aller assez bien pour moi. 

Y a-t-il un moyen facile de s'y prendre? Cela semble assez simple.

20
Chris

Les deux alternatives principales: tout lire en une seule chaîne et supprimer les retours à la ligne:

clean = open('thefile.txt').read().replace('\n', '')

ou, lisez ligne par ligne, en supprimant la nouvelle ligne qui termine chaque ligne et reliez-la:

clean = ''.join(l[:-1] for l in open('thefile.txt'))

La première solution est probablement plus rapide, mais, comme toujours, je vous recommande vivement de MESURER la vitesse (par exemple, utilisez python -mtimeit) dans les cas qui vous intéressent, au lieu de simplement supposer que vous connaissez les performances. Les RE sont probablement plus lents, mais encore une fois: ne devinez pas, MESUREZ!

Voici donc quelques chiffres pour un fichier texte spécifique sur mon ordinateur portable:

$ python -mtimeit -s"import re" "re.sub('\n','',open('AV1611Bible.txt').read())"
10 loops, best of 3: 53.9 msec per loop
$ python -mtimeit "''.join(l[:-1] for l in open('AV1611Bible.txt'))"
10 loops, best of 3: 51.3 msec per loop
$ python -mtimeit "open('AV1611Bible.txt').read().replace('\n', '')"
10 loops, best of 3: 35.1 msec per loop

Le fichier est une version de la Bible KJ, téléchargée et décompressée à partir de ici (je pense qu’il est important d’exécuter de telles mesures sur un fichier facile à récupérer afin que d’autres puissent le reproduire!).

Bien sûr, quelques millisecondes plus ou moins sur un fichier de 4,3 Mo, 34 000 lignes, n’ont peut-être pas beaucoup d’importance pour vous. mais comme l'approche la plus rapide est aussi la plus simple (loin d'être un événement inhabituel, en particulier en Python ;-), je pense que c'est une très bonne recommandation.

33
Alex Martelli

Je ne voudrais pas utiliser une expression régulière pour remplacer simplement les nouvelles lignes - J'utiliserais string.replace(). Voici un script complet:

f = open('input.txt')
contents = f.read()
f.close()
new_contents = contents.replace('\n', '')
f = open('output.txt', 'w')
f.write(new_contents)
f.close()
9
RichieHindle
import re
re.sub("\n", "", file-contents-here)
3
Alix Axel

Je sais que c’est un problème d’apprentissage python, mais si vous essayez de le faire à partir de la ligne de commande, il n’est pas nécessaire d’écrire un script python. Voici quelques autres moyens:

cat $FILE | tr -d '\n'

awk '{printf("%s", $0)}' $FILE

Aucun de ceux-ci ne doit lire l'intégralité du fichier en mémoire. Par conséquent, si vous devez traiter un très gros fichier, ils seront peut-être meilleurs que les solutions python fournies.

2
Cascabel

Ancienne question, mais comme elle figurait dans mes résultats de recherche pour une requête similaire et que personne n’a mentionné les fonctions de chaîne python strip() || lstrip() || rstrip(), j’ajouterai que pour la postérité (et quiconque préfère ne pas utiliser re quand ce n’est pas nécessaire):

old = open('infile.txt')
new = open('outfile.txt', 'w')
stripped = [line.strip() for line in old]
old.close()
new.write("".join(stripped))
new.close()
0
Kurtosis