Python:使用列表列表读取CSV文件的字段

时间:2013-06-16 18:06:45

标签: python list csv

我只是想知道如何从具有下一个结构的CVS文件中读取特殊字段:

40.0070222,116.2968604,2008-10-28,[["route"], ["sublocality","political"]]
39.9759505,116.3272935,2008-10-29,[["route"], ["establishment"], ["sublocality", "political"]]

读取我曾经使用的cvs文件的方式:

with open('routes/stayedStoppoints', 'rb') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',', quotechar='"')

问题在于前三个字段没问题我可以使用:

for row in spamreader:

row [0],row [1],row [2]我可以毫无问题地访问。但在最后一个字段中,我猜这与csv.reader(csvfile,delimiter =',',quotechar ='“')也分开为每个子列表:

所以当我试图访问时只是告诉我:

[["route"] 

任何人都有一个处理最后一个字段的解决方案有一个完整列表(确实列表列表)

[["route"], ["sublocality","political"]]

以便可以访问每个类别。

由于

3 个答案:

答案 0 :(得分:3)

您的格式接近于json。您只需将每一行括在括号中,并引用日期。 对于每一行l,只需执行:

lst=json.loads(re.sub('([0-9]+-[0-9]+-[0-9]+)',r'"\1"','[%s]'%(l)))

导致lst

[40.0070222, 116.2968604, u'2008-10-28', [[u'route'], [u'sublocality', u'political']]]

您需要导入json解析器和正则表达式

import json
import re

编辑 :您询问了如何访问包含“route”的元素。答案是

lst[3][0][0]

'政治'在

lst[3][1][1]

如果字符串(“政治”和其他字符串)可能包含类似日期的字符串,那么您应该使用@unutbu的解决方案

答案 1 :(得分:2)

使用line.split(',', 3)split on just the first 3 commas

import json
with open(filename, 'rb') as csvfile:
    for line in csvfile:
        row = line.split(',', 3)
        row[3] = json.loads(row[3])
        print(row)

产量

['40.0070222', '116.2968604', '2008-10-28', [[u'route'], [u'sublocality', u'political']]]
['39.9759505', '116.3272935', '2008-10-29', [[u'route'], [u'establishment'], [u'sublocality', u'political']]]

答案 2 :(得分:2)

这不是有效的CSV文件。 csv模块将无法读取此内容。

如果行结构总是这样(两个数字,一个日期和一个嵌套列表),你可以这样做:

import ast
result = []
with open('routes/stayedStoppoints') as infile:
    for line in infile:
        coord_x, coord_y, datestr, objstr = line.split(",", 3)
        result.append([float(coord_x), float(coord_y),
                      datestr, ast.literal_eval(objstr)])

结果:

>>> result
[[40.0070222, 116.2968604, '2008-10-28', [['route'], ['sublocality', 'political']]],
 [39.9759505, 116.3272935, '2008-10-29', [['route'], ['establishment'], ['sublocality', 'political']]]]