使用Python检查文件是否为CSV格式

40

有没有人能够提供一种使用Python检查文件是否为CSV格式的有效方法?


2
欢迎来到stackoverflow。您的问题需要更多详细信息。作为一个开端,您能否定义一下您所说的“csv格式”是什么?您需要仔细地定义这个格式。在这个格式中是否存在转义字符、注释标记或引号字符?如果这个问题是作业,请添加一个名为“homework”的标签,以便回答者可以给您正确的指导。 - Heath Hunnicutt
1
我的意思是CSV文件,即逗号分隔值文件,请参见http://en.wikipedia.org/wiki/Comma-separated_values获取更多详细信息。 - Joe
2
如果所说的CSV是指“逗号分隔值”,那么该格式没有标准。 - Max
3
@Max,CSV没有官方标准格式,你说得对,但我发现标准库中的csv模块对事实上的标准有很好的支持。 - gotgenes
@Joe 为什么不接受一个有效的答案呢? - raratiru
5个回答

39
你可以尝试以下方法,但是仅仅从csv.Sniffer获取方言并不能保证你拥有一个有效的CSV文档。
csv_fileh = open(somefile, 'rb')
try:
    dialect = csv.Sniffer().sniff(csv_fileh.read(1024))
    # Perform various checks on the dialect (e.g., lineseparator,
    # delimiter) to make sure it's sane

    # Don't forget to reset the read position back to the start of
    # the file before reading any entries.
    csv_fileh.seek(0)
except csv.Error:
    # File appears not to be in CSV format; move along

5
“不足以保证…”:是的,没有提供方言的情况下,我的语言检测把一个ZIP文件识别为有效的CSV文件,并且使用@符号作为分隔符。 - alanjds
1
为什么要以二进制模式打开文件?在Python 3中,样例会被拒绝:"cannot use a string pattern on a bytes-like object"。因此,第一行应该是:csv_fileh = open(somefile, 'rt')。 - Dobedani

3

除了gotgenes的答案中提到的内容,我认为还需检查不应包含在CSV文件中的不可打印字符,这样可以获得良好的结果。

def is_csv(infile):
    try:
        with open(infile, newline='') as csvfile:
            start = csvfile.read(4096)

            # isprintable does not allow newlines, printable does not allow umlauts...
            if not all([c in string.printable or c.isprintable() for c in start]):
                return False
            dialect = csv.Sniffer().sniff(start)
            return True
    except csv.Error:
        # Could not get a csv dialect -> probably not a csv.
        return False

1

Python有一个csv模块,因此您可以尝试在各种不同的方言下解析它。


-1

尝试将其解析为CSV格式,看看是否会出错。


-2
您需要清楚地考虑什么样的文件符合 CSV 文件的标准。
例如,逗号之间可以包含什么字符。是纯文本吗?还是包括 Unicode 字符?每一行是否具有相同数量的逗号?
我不知道 CSV 文件有严格的定义。通常它是由逗号分隔的 ASCII 文本,并且每一行具有相同数量的逗号,并以平台的行终止符结尾。
无论如何,一旦您回答了上述问题,就可以更进一步了解如何检测文件是否为 CSV 文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接