【问题标题】:Neat way to check first line of a file before reading CSV在读取 CSV 之前检查文件第一行的巧妙方法
【发布时间】:2013-03-14 21:51:54
【问题描述】:

我正在寻找一种聪明的方法来检查文件的第一行,然后再将其作为 csv 文件读取。我想检查是否有# coding: xxx 行,以便我可以相应地解码读取数据。但如果没有这样的行,第一行可能已经包含一个数据集。寻求对我来说似乎很残酷,我希望有一个巧妙的方法来做到这一点。

import re
import csv
fl = open(filename)
line = fl.readline()
coding = re.match('^#\s*coding\s*(:|=|:=)\s*([\w\d\-_]+)\s*$', line)
fl.seek(0)

reader = csv.reader(fl)
# ...

【问题讨论】:

  • 什么是“如此残酷”的寻求?
  • @ThomasOrozco:这是另一个最终可以跳过的 I/O 调用。

标签: python csv io


【解决方案1】:

我认为您当前的方法没有任何问题,但这里有一个您可能会觉得更可取的替代方法:

import re
import csv
import itertools

line = next(f1)
coding = re.match('^#\s*coding\s*(:|=|:=)\s*([\w\d\-_]+)\s*$', line)
reader = csv.reader(itertools.chain([line], f1))

从您的问题或您发布的代码中不清楚,但如果您不想在您的正则表达式匹配的情况下包含第一行,您可以执行以下操作:

reader = csv.reader(f1 if coding else itertools.chain([line], f1))

【讨论】:

  • 这很好!我不知道我可以将任何可迭代对象传递给 csv.reader 类。
  • 一般来说,不要将.readline() 和迭代器访问文件混用(你可能会因为缓冲而丢失数据)。请改用line = next(f1)
  • 需要处理next() 可能抛出的StopIteration 异常。无论如何,很好的答案!
【解决方案2】:

第一行会是这样吗?

# coding: xxx, some other "field", and maybe another field

如果没有,您可以只阅读第一行,查找逗号,如果没有找到逗号,请尝试解释编码,否则将其(以及每隔一行)传递给csv.reader()

【讨论】:

    猜你喜欢
    • 2012-02-05
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多