web-dev-qa-db-fra.com

Bande Python avec\n

C'est mon problème.

J'essaie de lire un fichier texte, puis de convertir les lignes en floats. Le fichier texte contient \n et \t, mais je ne sais pas comment m'en débarrasser.

J'ai essayé d'utiliser line.strip() mais cela ne l'a pas enlevé et j'ai eu une erreur lorsque je voulais convertir le contenu en float. J'ai ensuite essayé line.strip("\n") mais cela n'a pas fonctionné non plus. Mon programme fonctionne bien lorsque je retire les \t et \n du fichier texte, mais cela fait partie de la tâche de le faire fonctionner avec eux. 

Je ne sais vraiment pas pourquoi cela ne fonctionne pas. Merci pour toute aide. 

44
Mallard Duck

Vous devriez pouvoir utiliser line.strip('\n') et line.strip('\t'). Mais ceux-ci ne modifient pas la variable line ... ils renvoient simplement la chaîne avec les champs \n et \t stripped Donc, vous devrez faire quelque chose comme

line = line.strip('\n')
line = line.strip('\t')

Cela devrait fonctionner pour supprimer du début et de la fin. Si vous avez \n et \t au milieu de la chaîne, vous devez faire

line = line.replace('\n','')
line = line.replace('\t','')

pour remplacer le \n et le \t par rien.

90
austin1howard

La méthode strip() supprime les espaces blancs par défaut. Il n'est donc pas nécessaire de l'appeler avec des paramètres tels que '\ t' ou '\ n'. Cependant, les chaînes en Python sont immuables et ne peuvent pas être modifiées, c’est-à-dire que l’appel line.strip() ne changera pas l’objet line. Le résultat est une nouvelle chaîne qui est renvoyée par l'appel.

Comme déjà mentionné, il serait utile que vous publiiez un exemple à partir de votre fichier d’entrée. S'il y a plus d'un numéro sur chaque ligne, strip() n'est pas la fonction à utiliser. Au lieu de cela, vous devriez utiliser split(), qui est également une méthode de chaîne.

Pour conclure, en supposant que chaque ligne contient plusieurs flottants séparés par des espaces et que vous souhaitiez créer une liste de tous les nombres, vous pouvez essayer les solutions suivantes:

floats = []
with open(filename) as f:
    for line in f:
        floats.extend([float(number) for number in line.split()])
20
Dan Gerhardsson

Pourquoi ne pas utiliser un motif python regex ?

import re
f = open('test.txt', 'r')
strings = re.findall(r"\S+", f.read())

Et pour votre cas de line.strip () ne fonctionnera pas car Python supprime uniquement les caractères de début et de fin

From Python Docs - Renvoie une copie de la chaîne avec caractères de fin et de fin supprimés. Si chars est omis ou None, les caractères d'espacement sont supprimés. Si donné et non None, les caractères doivent être une chaîne; les caractères de la chaîne seront supprimés aux deux extrémités de la chaîne sur laquelle cette méthode est appelée. 

5
sransara

Si vous essayez de convertir des lignes de flottants séparées par des caractères de tabulation, alors float(line) tentera de convertir la ligne entière en un seul flottant, ce qui échouera s'il y en a plus d'un. Utiliser strip pour se débarrasser des espaces de début et de fin ne va pas résoudre ce problème fondamental.

Peut-être avez-vous besoin de split chaque ligne en morceaux et de faire quelque chose avec chaque morceau?

1
Ben

la bibliothèque csv de pythons est bonne pour cela.

http://docs.python.org/library/csv.html

CSV = valeurs séparées par des virgules, mais si vous définissez le délimiteur =\t, cela fonctionne également pour les valeurs séparées par des tabulations.

1
robert king

Vous pouvez utiliser:

mylist = []
# Assuming that you have loaded data into a lines variable. 
for line in lines:
    mylist.append(line.strip().split('\t')

pour obtenir une liste python avec uniquement les valeurs de champ pour toutes les lignes de données.

0
Jobel

Souvent, en fonction de la façon dont vous lisez les lignes, afin de vous débarrasser de\n dans myline, Vous pouvez utiliser myline [: - 1] Puisque\n est le dernier caractère de myline. 

Pour le '\ t', vous pouvez utiliser replace () ou strip ()

0
jimifiki