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

4

我想知道如何从下面这种结构的CSV文件中读取特定字段:

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

我以前处理CSV文件的方式:

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个回答

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提供的解决方案。

是的!实际上,我的最后一个字段是对Google地点的请求,但是我如何访问类别中的第一个列表呢?我的意思是,我如何读取路线以与其他路线进行比较? - taonico

2
使用line.split(',', 3)仅在前3个逗号处分割
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

这不是一个有效的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']]]]

好的,但问题是我如何读取或提取每行的每个类别或类别组! - taonico
@taonico:你是什么意思?它们已经被提取到一个嵌套列表中了。例如,使用上面的resultresult[0][3][0][0]"route"result[0][3][1][1]"political"result[1][3][1][0]"establishment"等等。 - Tim Pietzcker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接