Python:跳过 csv.DictReader 中标有 # 的注释行

新手上路,请多包涵

使用 csv.DictReader 处理 CSV 文件很棒 - 但我有带有注释行的 CSV 文件(由一行开头的散列表示),例如:

 # step size=1.61853
val0,val1,val2,hybridisation,temp,smattr
0.206895,0.797923,0.202077,0.631199,0.368801,0.311052,0.688948,0.597237,0.402763
-169.32,1,1.61853,2.04069e-92,1,0.000906546,0.999093,0.241356,0.758644,0.202382
# adaptation finished

csv 模块 不包含任何跳过此类行的方法

我可以轻松地做一些骇人听闻的事情,但我想有一种很好的方法可以将 csv.DictReader 包装在其他一些迭代器对象周围,这些迭代器对象会进行预处理以丢弃这些行。

原文由 Dan Stowell 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 914
2 个回答

实际上这与 filter 配合得很好:

 import csv
fp = open('samples.csv')
rdr = csv.DictReader(filter(lambda row: row[0]!='#', fp))
for row in rdr:
    print(row)
fp.close()

原文由 Dan Stowell 发布,翻译遵循 CC BY-SA 3.0 许可协议

好问题。 Python 的 CSV 库缺乏对注释的基本支持(在 CSV 文件的顶部并不少见)。虽然 Dan Stowell 的解决方案适用于 OP 的特定情况,但它的局限性在于 # 必须作为第一个符号出现。一个更通用的解决方案是:

 def decomment(csvfile):
    for row in csvfile:
        raw = row.split('#')[0].strip()
        if raw: yield raw

with open('dummy.csv') as csvfile:
    reader = csv.reader(decomment(csvfile))
    for row in reader:
        print(row)

例如,以下 dummy.csv 文件:

 # comment
 # comment
a,b,c # comment
1,2,3
10,20,30
# comment

回报

['a', 'b', 'c']
['1', '2', '3']
['10', '20', '30']

当然,这与 csv.DictReader() 一样有效。

原文由 sigvaldm 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题