2017-10-21 132 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數據問題 - 文本文件的格式和處理它的代碼不同步。這個答案假設你知道你在讀你的文件時正在做什麼。如果你不知道如何閱讀你的文件,那麼你有一個完全不同的問題。 –