【问题标题】:Why does this CSV to Python dictionary code give an IndexError?为什么这个 CSV 到 Python 字典代码会给出 IndexError?
【发布时间】:2017-10-18 20:56:23
【问题描述】:

我正在编写代码以从 Python 中的 CSV 文件创建一个全局字典。代码没有达到我的预期。

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])

运行这段代码后,我预计 Shell 中会发生以下情况:

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

相反,运行 test.py 会引发下一个错误:

回溯(最近一次通话最后一次):
----文件“C:\Users\siemd\Desktop\test.py”,第 8 行,在
--------用户[行[0]] =浮动(行[1])
IndexError: 列表索引超出范围

如果我理解正确,那么 rows[0]rows[1] 无法返回值,因为它们超出了“列表”(这是一个读取的 csv 文件)的范围。
但他们应该……对吧?

【问题讨论】:

  • 您的 CSV 文件末尾可能有一个空行,或者某处某处只有一列。
  • users.csv 文件正是 test.py 中使用的文件,@DanielRoseman。所以每行有 2 列,没有最后一个空行

标签: python csv dictionary


【解决方案1】:

您应该检查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}
$

【讨论】:

  • 感谢@Mandraenke 的深入回答。添加if len(row)==2: 解决了这个问题。奇怪的是,末尾没有 换行符。检查了很多次......也许它与Python版本有关。我不知道...
猜你喜欢
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
相关资源
最近更新 更多