Python CSV 阅读器将 Row 作为列表返回

Posted

技术标签:

【中文标题】Python CSV 阅读器将 Row 作为列表返回【英文标题】:Python CSV reader return Row as list 【发布时间】:2013-02-28 17:53:21 【问题描述】:

我正在尝试使用 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 以这种方式打印,并且无论如何要将一行分成 3 个 ints 的列表,例如 [130534543, 47.00009, 23001.9000]

编辑:

正如答案所述,我在上面的代码中使用了错误的 csv 函数,但即使修复它给了我一个列表,该列表本身的格式与 dict 相同,这样:

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

事实证明,我还必须从 data = urllib.urlopen(url).read() 中删除 .read()

【问题讨论】:

与您的问题无关,但您应该非常小心地在迭代循环中执行 put()。相反,请考虑对看跌期权进行批处理。在大多数情况下,性能提升巨大。还要问自己是否要提交带有索引的 put,以及由此产生的对循环内查询的依赖。你能非规范化成一个键控记录吗?这将对使用 get 替换查询的性能产生巨大影响,并且 put 上没有索引。 感谢您的建议。如果如您所说,批处理put()s 将有助于提高性能,那么我会这样做。至于使用键控记录,我对此知之甚少,并将对其进行研究。再次感谢您。 【参考方案1】:

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]

【讨论】:

哇,我觉得自己很笨。我一直在查看我的代码和 CSV/Python 文档,但从未注意到我在使用 DictReader()。谢谢

以上是关于Python CSV 阅读器将 Row 作为列表返回的主要内容,如果未能解决你的问题,请参考以下文章

为 CSV 阅读器引用 Python 字典中的键

如何将 csv 文件转换为可作为文本读取的列表列表? Python

Python将csv写入字典列表,其中标题作为键,行作为值

数据可视化:CSV格式,JSON格式

在 Python 中将 .csv 值作为单个列表导入

pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引loc基于行层索引的最外层行索引索引行数据(outermost row index)