【发布时间】: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 将有助于提高性能,那么我会这样做。至于使用键控记录,我对此知之甚少,并将对其进行研究。再次感谢您。
标签: python list google-app-engine parsing csv