2017-10-18 34 views
0

我正在編寫代碼以從Python中的CSV文件製作全局字典。代碼沒有達到我所期望的。爲什麼此CSV到Python字典代碼會給出IndexError?

users.csv

name,money_in_pocket 
siem,10 
bart,10 
ivar,10 

test.py

import csv 
global users 
users = {} 
with open('users.csv', mode='r') as readuserfile: 
    readusers = csv.reader(readuserfile, delimiter=',') 
    next(readusers) 
    for rows in readusers: 
     users[rows[0]] = float(rows[1]) 

運行這段代碼後,我希望以下在外殼發生:

>>>print(dict) 
{'siem': 10, 'bart': 10, 'ivar': 10} 

相反,運行test.py會拋出下一個錯誤:

Traceback (most recent call last):
----File "C:\Users\siemd\Desktop\test.py", line 8, in
--------users[rows[0]] = float(rows[1])
IndexError: list index out of range

如果我理解這個權利,那麼rows[0]rows[1]無法返回值,因爲它們超出了'list'(它是一個讀取csv文件)的範圍。
但他們應該......對嗎?

+0

你可能有你的CSV結束一個空行,或行的地方,只有一列。 –

+0

users.csv文件就是test.py中使用的文件@DanielRoseman。所以每行有2列,沒有最後一行空白 – Siem

回答

0

您應該檢查rows的長度和類型。試過你的例子:

$cat t.py 
import csv 
global users 
users = {} 
with open('users.csv', mode='r') as readuserfile: 
    readusers = csv.reader(readuserfile, delimiter=',') 
    next(readusers) 
    for rows in readusers: 
     users[rows[0]] = float(rows[1]) 

print users 
$cat users.csv 
name,money_in_pocket 
siem,10 
bart,10 
ivar,10 
$python t.py 
{'ivar': 10.0, 'bart': 10.0, 'siem': 10.0} 
$ 

工作正常。但如果在最後一個換行符失敗:

$cat >> users.csv 

$python t.py 
Traceback (most recent call last): 
    File "t.py", line 8, in <module> 
    users[rows[0]] = float(rows[1]) 
IndexError: list index out of range 
$ 

添加一個簡單的檢查可以幫助:

$cat t.py 
... 
    for rows in readusers: 
     if len(rows)==2: 
      users[rows[0]] = float(rows[1]) 
... 
$python t.py 
{'ivar': 10.0, 'bart': 10.0, 'siem': 10.0} 
$ 
+0

感謝這個深度答案@Mandraenke。加入'如果len(row)== 2:'解決了這個問題。奇怪的是,最後沒有換行符。檢查了很多次...也許它與Python版本有關。我不知道... – Siem

相關問題