Python 如何检查浏览的文件是.xlsx还是.csv?

Python 如何检查浏览的文件是.xlsx还是.csv?,python,Python,我正在使用openpyxl模块,但现在发现它不支持csv格式。那么,我如何区分传入的文件是.xlsx格式还是.csv格式?我想您有一个文件名,然后可以使用: ".xlsx" in filename 至少在xlsx的情况下,您可以非常确信,如果它失败了,那么它就不是xlsx。CSV是一种非常原始的格式,几乎所有东西都可以这样处理,但我认为这是您可以从中挤出的最大值。如果您使用的是OSX/Linux,则可以使用file命令 文件sample.xlsx sample.xlsx:Microsoft E

我正在使用openpyxl模块,但现在发现它不支持csv格式。那么,我如何区分传入的文件是.xlsx格式还是.csv格式?我想您有一个文件名,然后可以使用:

".xlsx" in filename

至少在xlsx的情况下,您可以非常确信,如果它失败了,那么它就不是xlsx。CSV是一种非常原始的格式,几乎所有东西都可以这样处理,但我认为这是您可以从中挤出的最大值。

如果您使用的是OSX/Linux,则可以使用file命令

文件sample.xlsx sample.xlsx:Microsoft Excel 2007+

文件sample.csv sample.csv:ASCII文本

如果您在Windows上,则可以安装

我认为最好的方法是以二进制模式检查文件内容的前四个字节,以检查是否存在类似zip的文件

xlsx
文件(和其他存档文件)的“幻数”为
50 4B 03 04
(十六进制)-有关许多其他所谓的“幻数”的列表,请参阅

在Python中,我们可以将
50 4B 03 04
表示为
b'PK\x03\x04'
,因此我们可以创建一个函数来加载文件,读取前四个字节,并检查它们是否是这个神奇的数字:

filename1 = "test.xlsx"
if is_xlsx(filename1):
    print(filename1, "is an Excel file!")
    # load it openpyxl
else:
    print(filename1, "is an CSV file!")
    # load it with csv


filename2 = "test.csv"
if is_xlsx(filename2):
    print(filename2, "is an Excel file!")
    # load it openpyxl
else:
    print(filename2, "is an CSV file!")
    # load it with csv
输出(可能是意外的):


归根结底,将文件定义为特定格式的唯一方法是能够将其解析为特定格式。扩展是常规的,但是任意的。仅仅因为扩展名为
.csv
的文件并不意味着它实际上是一个csv文件,并且仅仅因为文件没有扩展名
.csv
也不意味着它不是一个csv文件。我想你可以检查一下xlsx的幻数是否在开头。。。
test.xlsx is an Excel file!
test.csv is an CSV file!