我只是想知道如何从具有下一个结构的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"]]
以便可以访问每个类别。
由于
答案 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']]]]