2017-07-19 2 views
0

je tentais d'exécuter un code que j'ai écrit le code lit des lignes sur le fichier txt donc mon fichier texte ressemble à (i ai 20 lignes)convertir une liste à l'entier le python

['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40']

['39', '40', '39', '38', '36', '39', '40', '39', '42', '38', '40', '41', '38', '39', '39', '40', '38', '40', '39', '41']

['39', '40', '40', '38', '36', '39', '40', '39', '43', '38', '40', '41', '38', '39', '39', '40', '38', '40', '39', '41']

i a écrit ce script pour avoir un nouveau fichier qui ressemble à ceci

39 40 39 38 35 38 39 39 42 37 40 41 37 39 39 40 38 40 39 40

39 40 39 38 36 39 40 39 42 38 40 41 38 39 39 40 38 40 39 41

39 40 40 38 36 39 40 39 43 38 40 41 38 39 39 40 38 40 39 41

le script que je l'ai écrit est celui

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 

fichier=open("data.txt", "r") 
#resultat=open("data_entier.txt", "w") 

j=0; 

while j < 20: 
    lignes= fichier.readline() 
    for i in range(len(lignes)): 
     lignes[i] = int(lignes[i]) 

    print(lignes)) 

    j+=1 

fichier.close() 

l'erreur que je reçois est celui

ValueError: invalid literal for int() with base 10: '['

+0

On dirait que tout ce que vous voulez faire est de remplacer eve rence de '' ['' ',' '' '', '', '', '' et ''] '' avec une chaîne vide, n'est-ce pas? Pour cela, vous n'avez pas besoin de convertir quoi que ce soit en '' int''. –

+0

oui exactement, comment puis-je faire cela? –

+0

d'où provient 'data.txt'? Il semble que vous choisissiez de jeter les listes là d'abord, plutôt que le format que vous vouliez réellement ... –

Répondre

4

Le problème est que lorsque vous lisez dans readline de votre dossier, vous aurez une ligne

"['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40']\n" 

Comme vous pouvez le voir, le premier élément dans votre chaîne est [. Donc, vous n'avez pas réellement les numéros structurés comme vous vous attendez. Au lieu de cela, puisque vous semblez avoir déjà une structure liste représentée comme une chaîne, pensez à utiliser literal_eval de ast:

>>> d = literal_eval(d) 
>>> d 
['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40'] 

Maintenant, vous avez fait une liste de chaînes. Maintenant, vous pouvez continuer à modifier que à vos ints. En tant que processus simple, vous pouvez faire quelque chose comme ceci:

>>> converted_to_ints = map(int, d) 
>>> print(list(converted_to_ints)) 
[39, 40, 39, 38, 35, 38, 39, 39, 42, 37, 40, 41, 37, 39, 39, 40, 38, 40, 39, 40] 

Note, en ce qui concerne l'utilisation map en Python 3, vous obtenez un objet carte , qui retourne un itérateur. Donc, si vous avez besoin de la liste , c'est pourquoi list est appelée lors de l'impression. Vous pouvez lire à ce sujet ici:

https://docs.python.org/3/library/functions.html#map

Zone d'amélioration

Basé sur le contenu du fichier que vous lisez, ce serait mieux à structure pas les données comme celle-ci. Au lieu de cela, ce qui doit être fait n'est pas de définir les données comme une représentation de liste dans le fichier, mais seulement le contenu de la liste. Ceci évite d'avoir à effectuer la solution ci-dessus, et à la place, un simple:

with open('file.txt') as f: 
    data = f.read().splitlines() # will remove newline character 
    for line in data: 
     # perform operations 

suffirait.

+0

merci je vais vérifier cela maintenant –

2

Vous êtes et non en évaluant la ligne comme une liste: chaque ligne est juste une chaîne commençant par '['. Donc, vous itérez sur les caractères de la ligne.

Si le fichier est comme vous le décrivez cependant, vous pouvez facilement évaluer la ligne avec ast.literal_eval:

from ast import literal_eval 

with open("data.txt", "r") as fichier: 
    for line,_ in zip(fichier,range(20)): 
     the_list = literal_eval(line) 
     the_list = [int(x) for x in the_list] 
     print(the_list)) 

Nous ici utilisé zip comme un moyen d'obtenir les 20 premières lignes. Si vous voulez traiter tous les lignes, vous pouvez simplement utiliser:

with open("data.txt", "r") as fichier: 
    for line in fichier: 
     the_list = literal_eval(line) 
     the_list = [int(x) for x in the_list] 
     print(the_list)) 
+0

merci je vais vérifier cela –

0

Vous lisez une ligne, de sorte que vous pouvez simplement remplacer les caractères que vous ne voulez pas.

string = "['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40']" 
s = string.replace(',','').replace('[','').replace(']','').replace("'","") 
print s 
#output: 39 40 39 38 35 38 39 39 42 37 40 41 37 39 39 40 38 40 39 40 
+0

Si vous allez descendre cette route, et sachant à quoi ressemble chaque ligne, vous auriez pu faire 'chaîne [1: -2 ] '. Cela supprimera le premier '[' et le '' final '] \ n'. – idjaw

0

Bien que dans ce cas, les ast.literal_eval solutions présentées par idjaw et Willem Van Onsem semblent comme meilleur ajustement évident, laissez-moi vous présenter une autre solution:

numbers_text = "['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40']" 

au lieu d'enchaîner plusieurs replace opérations, vous pouvez utiliser str.translate pour se débarrasser de plusieurs personnages en un seul passage, en fournissant le troisième argument à str.maketrans:

If there is a third argument, it must be a string, whose characters will be mapped to None in the result.

Ensuite, nous pouvons soit utiliser un simple list comprehension pour convertir les nombres séparés de str à int:

numbers_int = [int(x) for x in numbers_text.translate(str.maketrans("","","[',]")).split()] 

Ou utiliser map:

numbers_int = list(map(int, numbers_text.translate(str.maketrans("","","[',]")).split())) 

Les deux se traduira par une nouvelle list de int :

[39, 40, 39, 38, 35, 38, 39, 39, 42, 37, 40, 41, 37, 39, 39, 40, 38, 40, 39, 40] 
+0

nit: vous aurez très probablement un trailing \ n dans la chaîne au début. – idjaw

+0

@idjaw: oui, mais il sera supprimé par 'split()': '" 1 2 3 \ n ".split()' -> '['1', '2', '3']' –

+0

Ah droite. Basé sur votre solution qui est correcte. J'avais 'split (',')' 'dans ma tête, ce qui n'aurait pas fait ça. – idjaw