web-dev-qa-db-fra.com

Se débarrasser de \ n en utilisant .readlines ()

J'ai un fichier .txt avec des valeurs.

Les valeurs sont listées comme suit:

Value1
Value2
Value3
Value4

Mon objectif est de mettre les valeurs dans une liste. Quand je le fais, la liste ressemble à ceci:

['Value1\n', 'Value2\n', ...]

Le \n n'est pas nécessaire.

Voici mon code:

t = open('filename.txt', 'r+w')
contents = t.readline()

alist = []

for i in contents:
    alist.append(i)
199
TDNS

Cela devrait faire ce que vous voulez (contenu du fichier dans une liste, par ligne, sans\n)

with open(filename) as f:
    mylist = f.read().splitlines() 
255
user3131651

Je ferais ceci:

alist = [line.rstrip() for line in open('filename.txt')]

ou:

with open('filename.txt') as f:
    alist = [line.rstrip() for line in f]
107
hughdbrown

Vous pouvez utiliser .rstrip('\n') pour uniquement supprimer les retours à la ligne à la fin de la chaîne:

for i in contents:
    alist.append(i.rstrip('\n'))

Cela laisse tous les autres espaces intacts. Si vous ne vous souciez pas des espaces au début et à la fin de vos lignes, le gros marteau lourd s'appelle .strip() .

Cependant, étant donné que vous lisez un fichier et que vous enregistrez tout dans la mémoire malgré tout , il est préférable d’utiliser la méthode str.splitlines() ; cela divise une chaîne sur les séparateurs de lignes et renvoie une liste de lignes sans ces séparateurs; utilisez ceci sur le résultat file.read() et n'utilisez pas du tout file.readlines():

alist = t.read().splitlines()
85
Martijn Pieters

pour chaque chaîne de votre liste, utilisez .strip() qui supprime les espaces du début ou de la fin de la chaîne:

for i in contents:
    alist.append(i.strip())

Mais selon votre cas d'utilisation, vous feriez mieux d'utiliser quelque chose comme numpy.loadtxt ou même numpy.genfromtxt si vous avez besoin d'un joli tableau des données que vous lisez dans le fichier.

11
askewchan

Après avoir ouvert le fichier, la compréhension de liste peut le faire en une seule ligne:

fh=open('filename')
newlist = [line.rstrip() for line in fh.readlines()]
fh.close()

N'oubliez pas de fermer votre dossier par la suite.

10
Lisle
from string import rstrip

with open('bvc.txt') as f:
    alist = map(rstrip, f)

Nota Bene: rstrip() supprime les espaces, c'est-à-dire: \f, \n, \r, \t, \v, \x et vide,
mais je suppose que vous ne souhaitez que conserver les caractères significatifs dans les lignes. Ensuite, la simple map(strip, f) s'intégrera mieux, supprimant également les espaces blancs de titre.


Si vous voulez vraiment éliminer uniquement les symboles NL \n et RF \r, faites:

with open('bvc.txt') as f:
    alist = f.read().splitlines()

splitlines () sans argument passé ne conserve pas les symboles NL et RF (Windows enregistre les fichiers avec NLRF à la fin des lignes, du moins sur ma machine), mais conserve les autres espaces, notamment les espaces et onglets.

.

with open('bvc.txt') as f:
    alist = f.read().splitlines(True)

a le même effet que

with open('bvc.txt') as f:
    alist = f.readlines()

c'est-à-dire que NL et RF sont conservés

9
eyquem

J'ai eu le même problème et j'ai trouvé la solution suivante très efficace. J'espère que cela vous aidera ou aidera tous ceux qui veulent faire la même chose.

Tout d’abord, je commencerais par une déclaration "avec" car elle garantit la bonne ouverture/fermeture du fichier.

Ça devrait ressembler a quelque chose comme ca:

with open("filename.txt", "r+") as f:
    contents = [x.strip() for x in f.readlines()]

Si vous souhaitez convertir ces chaînes (chaque élément de la liste de contenu est une chaîne) en nombre entier ou en virgule flottante, vous pouvez procéder comme suit:

contents = [float(contents[i]) for i in range(len(contents))]

Utilisez int au lieu de float si vous souhaitez convertir en entier.

C'est ma première réponse dans SO, donc désolé si le formatage n'est pas correct.

4
geo1230

J'ai utilisé la fonction strip pour supprimer les caractères de nouvelle ligne, car les lignes divisées jetaient des erreurs de mémoire sur un fichier de 4 Go.

Exemple de code:

with open('C:\\aapl.csv','r') as Apple:
    for apps in Apple.readlines():
        print(apps.strip())
3
Yogamurthy

J'ai récemment utilisé cela pour lire toutes les lignes d'un fichier:

alist = open('maze.txt').read().split()

ou vous pouvez l'utiliser pour ce petit plus de sécurité supplémentaire:

with f as open('maze.txt'):
    alist = f.read().split()

Cela ne fonctionne pas avec les espaces entre les textes d'une seule ligne, mais il semblerait que votre fichier d'exemple pourrait ne pas avoir d'espace séparant les valeurs. C'est une solution simple qui renvoie une liste précise de valeurs et n'ajoute pas de chaîne vide: '' pour chaque ligne vide, telle qu'une nouvelle ligne à la fin du fichier.

1
micsthepick
with open('D:\\file.txt', 'r') as f1:
    lines = f1.readlines()
lines = [s[:-1] for s in lines]
0
jperezmartin