Python CSV 阅读器返回列表作为行

6 投票
1 回答
15699 浏览
提问于 2025-04-17 18:53

我正在用Python解析一个CSV文件,想要能够通过 row[0]row[1] 这样的方式来访问每一行的项目。

到目前为止,这是我的代码:

def get_bitstats():
    url = 'http://bitcoincharts.com/t/trades.csv?symbol=mtgoxUSD'
    data = urllib.urlopen(url).read()
    dictReader = csv.DictReader(data)
    obj = BitData()
    for row in dictReader:

        obj.datetime = datetime.datetime.fromtimestamp(int(row['0'])/1000000)
        q = db.Query(BitData).filter('datetime', obj.datetime)
        if q != None:
            raise ValueError(obj.datetime + 'is already in database')
        else:
            obj.price = row['1']
            obj.amount = row['2']
            obj.put()

运行后我得到了 KeyError: '0' 的错误,我不知道该怎么设置。 我把这个输入到一个交互式的命令行中,当我运行

for row in dictReader:
    print row

我得到的输出是:

{'1': '3'}
{'1': '6'}
{'1': '2'}
{'1': '6'}
{'1': '9'}
{'1': '8'}
{'1': '6'}
{'1': '4'}
{'1': '4'}
{'1': '', None: ['']}
{'1': '4'}
{'1': '2'}
{'1': '.'}
{'1': '0'}
{'1': '5'}
{'1': '7'}
{'1': '1'}
{'1': '6'}
{'1': '0'}
{'1': '0'}
{'1': '0'}
{'1': '0'}
{'1': '0'}
{'1': '0'}
{'1': '0'}
{'1': '', None: ['']}
{'1': '0'}
{'1': '.'}
{'1': '0'}
{'1': '1'}
{'1': '0'}
{'1': '0'}
{'1': '5'}
{'1': '4'}
{'1': '2'}
{'1': '5'}
{'1': '0'}
{'1': '0'}
{'1': '0'}
{'1': '0'}
{'1': '1'}
{'1': '3'}
{'1': '6'}
{'1': '2'}
{'1': '6'}
{'1': '9'}
{'1': '8'}
{'1': '6'}
{'1': '4'}
{'1': '4'}

然后就这样一直输出,成千上万行。(我相信这个CSV文件有成千上万的数据)

为什么我的CSV会这样打印?有没有办法把一行分成三个 ints,比如说 [130534543, 47.00009, 23001.9000] 这样的格式?

编辑:

根据回答的内容,我发现我在上面的代码中使用了错误的CSV函数,但即使修正后得到的列表格式还是和字典一样:

['1']
['2']
['1']
['3']
['8']
['3']
['5']
.
.
.

结果我还需要把 data = urllib.urlopen(url).read() 中的 .read() 去掉。

1 个回答

8

csv.reader 会把每一行的数据返回为一个列表

reader = csv.reader(data)

for line_list in reader:
   pass
   # line_list is a list of the data contained in a row so you can access line_list[0]

撰写回答