繁体   English   中英

使用Python中的DictReader确定CSV文件中的表头

[英]Use DictReader in Python to determine table header in CSV file

我正在使用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  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM