繁体   English   中英

读取带有重复标题的CSV文件

[英]Reading a CSV-file with repetitive headers

我以前没有在python使用过csv module ,但似乎足够方便使用。

问题是我尝试读取的CSV文件不时在文件中还包含标头(索引)。

像这样:

A, B, C, D, E, F
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6
A, B, C, D, E, F
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6
A, B, C, D, E, F
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6

我可以按原样使用csv module ,还是必须自己解析。

您可以通过检查是否仅读取标题行来按原样使用它。 例如,使用DictReader ,您可以执行以下操作:

with open('file.csv') as f:
    reader = csv.DictReader(f)
    lines = [row for row in reader
             if not all(k == v for k, v in row.iteritems())]

这对您的示例文件起作用的方式是:

  1. DictReader构造函数读取第一个标题行,确定这些字段的名称分别为"A", "B", "C", "D", "E", "F"
  2. 遍历reader然后返回字典,例如{"A": "1", "B": "2", ...}
  3. 在列表理解lines着眼于各行的字典。 首先会看到一个类似{"A": "1", ...}的字典。 all(k == v for k, v in row.iteritems())该行的键和值,设置例如k = "A"v = "1" 根据字典决定如何迭代,它首先看到的是哪个,它将看到k != v ,因此all()调用将为False ,这意味着该行将其放入列表lines
  4. 当到达重复的标题行时,它将看到一个类似{"A": "A", "B": "B", ...}的字典。 然后,由于键等于每个字典元素的值,因此all()调用将返回True ,并且列表理解中的条件将为False ,这意味着该行不会进入最终列表。 请注意,如果标题行中的行间距可能不同,则需要在键/值上调用.strip() ,然后再在all()调用中进行比较。
  5. 在结束时, lines为您的样品文件将是等于[{"A": 1, "B": 2, ...}] * 9 ; 重复的标题行已被删除。

如果你要处理的文件中的行由行,而不是将其读入一个列表中的所有一次,只是更改列表理解lines成发电机表达,通过改变[row for row ...](row for row ...) 然后你可以遍历lines ,但你循环之后的每一行就会被忘记(比如,如果你没有for row in reader在首位)。

暂无
暂无

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

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