2017-10-21 30 views
0

Contenu de scores.txt fichier qui répertorie les performances des joueurs à un certain jeu:carte en Python

80,55,16,26,37,62,49,13,28,56 
43,45,47,63,43,65,10,52,30,18 
63,71,69,24,54,29,79,83,38,56 
46,42,39,14,47,40,72,43,57,47 
61,49,65,31,79,62,9,90,65,44 
10,28,16,6,61,72,78,55,54,48 

Le programme suivant lit le fichier et stocke les scores dans une liste

f = open('scores.txt','r') 
L = [] 
for line in f: 
    L = L + map(float,str.split(line[:-1],',')) 
print(L) 

Mais cela conduit à des messages d'erreur. On m'a donné du code en classe donc très confus comme très nouveau à Pyton. Puis-je corriger le code?

+2

« conduit à des messages d'erreur » Est-ce que vous avez envie de les partager avec nous? –

+2

vous devriez utiliser 'avec open ('scores.txt', 'r')' – chrisz

Répondre

7

Il semble que vous ayez adapté le code python2.x à utiliser dans python3.x. Notez que map ne renvoie pas une liste dans python3.x, il renvoie un générateur objet carte (pas une liste, fondamentalement) que vous devez convertir en un list de manière appropriée.

En outre, je recommande d'utiliser list.extend au lieu d'ajouter les deux ensemble. Pourquoi? Le premier crée un nouvel objet de liste chaque fois que vous effectuez une addition, et est inutile en termes de temps et d'espace.

numbers = [] 
for line in f: 
    numbers.extend(list(map(float, line.rstrip().split(',')))) 

print(numbers) 

Une autre façon de le faire serait:

for line in f: 
    numbers.extend([float(x) for x in line.rstrip().split(',')]) 

qui se trouve être un peu plus lisible. Vous pouvez également choisir de vous débarrasser de la boucle externe for en utilisant une compréhension de liste imbriquée .

numbers = [float(x) for line in f for x in line.rstrip().split(',')] 

aussi, oublié de mentionner ce (grâce à chris in the comments), mais vous devriez vraiment être utilisez un gestionnaire de contexte gérer le fichier E/S.

with open('scores.txt', 'r') as f: 
    ... 

Il est plus propre, car il ferme vos fichiers automatiquement lorsque vous avez terminé.


Après avoir vu votre message ValueError, il est clair questions de là-bas avec vos données (caractères non valides, etc.). Essayons quelque chose d'un peu plus agressif.

numbers = [] 
with open('scores.txt', 'r') as f: 
    for line in f: 
     for x in line.strip().split(','): 
      try: 
       numbers.append(float(x.strip())) 
      except ValueError: 
       pass 

Si cela ne fonctionne pas, peut-être, quelque chose d'encore plus agressif avec regex pourrait le faire:

import re 

numbers = [] 
with open('scores.txt', 'r') as f: 
    for line in f: 
     line = re.sub('[^\d\s,.+-]', '', line) 
     ... # the rest remains the same 
+0

@Uriel, j'espère que vous voyez ceci, où que vous soyez ... –

+0

@Coldspeed: merci pour votre réponse. J'ai essayé vos codes mais tous ont la même erreur "ValueError: impossible de convertir la chaîne en float:". Je commencerais par "avec open ('scores.txt', 'r') comme f:" puis écris, par exemple, ta première suggestion de code. Qu'est-ce que je fais mal? – Lola

+0

@Lola Problème avec vos données - le format de votre fichier texte et le code qui le traite ne sont pas synchronisés. Cette réponse suppose que vous savez ce que vous faites lorsque vous lisez votre fichier. Si vous ne savez pas comment lire votre fichier, vous avez un problème complètement différent. –