2017-10-21 130 views
0

内容文件scores.txt的,列出的球员在某场比赛的表现:地图功能

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 

下面的程序读取该文件,分数存储到一个列表

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

但它会导致错误消息。我在课堂上给了代码,因此对Pyton来说很新奇。 我可以修复代码吗?

+2

“导致错误消息”你是否觉得与我们分享呢? –

+2

你应该使用'with open('scores.txt','r')' – chrisz

回答

7

看来你已经适应python2.x代码在python3.x中使用。请注意,map不会返回python3.x中的列表,它会返回生成器映射对象(基本上不是列表),您必须适当地将其转换为list

此外,我建议使用list.extend而不是将两者加在一起。为什么?前者每次执行添加时都会创建一个新的列表对象,并且在时间和空间方面都很浪费。

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

print(numbers) 

这样做将是一种替代方法:这恰好是稍微更具可读性

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

。您也可以选择使用嵌套列表理解摆脱外部for循环。

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

此外,忘了提这个(感谢chris in the comments),但你真的应该使用一个上下文管理器来处理文件I/O。

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

它更干净,因为它完成后会自动关闭文件。


看到您的ValueError消息后,很明显有一个与您的数据问题(无效字符等)。让我们尝试一些更具侵略性的东西。

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 

如果连不工作,也许,一些更激进的正则表达式有可能做到这一点:

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,希望你看到这个,无论你在哪里...... –

+0

@速速:谢谢你的回复。我试过你的代码,但它们都产生相同的错误“ValueError:无法将字符串转换为float:”。我将以“开放('scores.txt','r')为f:”开始,然后写出例如您的第一个代码建议。我究竟做错了什么? – Lola

+0

@Lola数据问题 - 文本文件的格式和处理它的代码不同步。这个答案假设你知道你在读你的文件时正在做什么。如果你不知道如何阅读你的文件,那么你有一个完全不同的问题。 –