我正在使用 DictReader 将 csv 表转换为 dict。但是 csv 文件在我需要的数据上方包含一些行。我可以使用next()
,但这不是一个智能解决方案,因为“垃圾”行的数量可能会有所不同。例如文件如下:
#stuff not needed
#more stuff which is not needed
label,path,value
a,/path,1
b,/path,2
那么在这种情况下我可以自动提取表格和标题吗?
如果这些字段是可识别的,您可以按照以下方式进行操作:
import csv
st='''\
stuff, not, needed
#more stuff which is not needed
# even more stuff not needed
label,path,value
a,/path,1
b,/path,2'''
data=[]
tgt='label,path,value'
start=False
for line in csv.reader(st.splitlines()):
if start:
data.append(line)
elif ','.join(e.strip() for e in line)==tgt:
start=True
data.append(line)
print data
# [['label', 'path', 'value'], ['a', '/path', '1'], ['b', '/path', '2']]
或者,如果您有一个看起来像这样的文件,您可以执行以下操作:
import csv
with open('/tmp/test.csv', 'r') as csvin:
tgt='label,path,value'
for line in csv.reader(csvin):
if ','.join(e.strip() for e in line)==tgt:
break
data={k:[] for k in line}
for line in csv.DictReader(csvin, data.keys()):
for k,v in line.items():
data[k].append(v)
print data
# {'path': ['/path', '/path'], 'value': ['1', '2'], 'label': ['a', 'b']}
这两种解决方案都依赖于预先知道的标头值。如果您不知道标题,您将需要知道如何通过其他方式识别标题之前不感兴趣的行,例如# this is a comment
如果您不知道标题元素是什么,但您知道通往标题的所有行都是空白的或前面带有#
,那么:
import csv
with open('/tmp/test.csv', 'r') as csvin:
for line in csv.reader(csvin):
if not ''.join(x.strip() for x in line) or line[0].strip()[0]=='#':
continue
else:
break
data={k:[] for k in line}
for line in csv.DictReader(csvin, data.keys()):
for k,v in line.items():
data[k].append(v)
print data