0

我正在使用 DictReader 将 csv 表转换为 dict。但是 csv 文件在我需要的数据上方包含一些行。我可以使用next(),但这不是一个智能解决方案,因为“垃圾”行的数量可能会有所不同。例如文件如下:

#stuff not needed
#more stuff which is not needed

label,path,value
a,/path,1
b,/path,2 

那么在这种情况下我可以自动提取表格和标题吗?

4

1 回答 1

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  
于 2013-09-13T00:27:01.797 回答