2012-01-31 55 views
1

我有一个脚本来拉入各种gzip和bz2压缩文件。在我将它们拉入之后,我正在寻找一个脚本来编写该文件,并根据其中包含的文件类型添加一个扩展。Python来检查gzip文件是xml还是csv

的文件格式,我大约关注包括XML,CSV和TXT文件,虽然我不是真正关心的CSV和TXT文件之间划定(添加TXT扩展名是不行了两者)。

我一直在使用python-magic库来确定使用哪个解压缩库(bz2 vs gzip),但想知道确定文件类型的最简单方法。使用python-magic我得到:

>>> ftype = m.from_file("xml_test.xml") 
>>> ftype 
'ASCII text' 
>>> ftype = m.from_file("csv_test.csv") 
>>> ftype 
'ASCII text' 

我现在的计划是在每个文件的第一行读取并根据它做出决定。有更容易的方法吗?

在回应@ phihag的回答显示我多么糟糕我原来的措辞这个问题: 我想要的东西,会首先检查文件是否有效的XML,如果没有则检查它是否是有效的CSV,最后如果它是无效的CSV但有效的纯文本,返回作为响应

注:有部分答案here但这种方法只介绍CSV检查,不是XML,TXT等

回答

5

你不能可靠地区分XML和csv,因为以下文件既是有效的XML也是有效的CSV文档:

<r>,</r> 

因此,您所能做的只是应用启发式方法,例如,如果第一个字符为<,则返回xml,否则返回csv。

同样,所有的CSV和XML文件也是有效的纯文本文件。

要检查文件是否构成有效的XML或CSV文档,您可以简单地解析它。如果你对绩效的,直接跳过实际文件树的构建,例如用sax或忽略的csv.reader项目:

import xml.sax,csv 
def getType(filename): 
    with open(filename, 'rb') as fh: 
    try: 
     xml.sax.parse(fh, xml.sax.ContentHandler()) 
     return 'xml' 
    except: # SAX' exceptions are not public 
     pass 
    fh.seek(0) 

    try: 
     for line in csv.reader(fh): 
     pass 
     return 'csv' 
    except csv.Error: 
     pass 

    return 'txt' 
+0

不够公平,我并没有考虑过你的很明显的反应给一个有效的CSV/XML。我的原始问题有些不完整,我会编辑我的问题,以更好地表明我在寻找什么 – 2012-01-31 18:02:58

+0

@SamJohnson更新了解决方案,该解决方案检查输入是否为有效的XML,然后检查它是否为有效的CSV。 – phihag 2012-01-31 18:26:09

+1

csv与文本的解决方案似乎不适用于我测试的几个文件。相反,我使用的解决方案[这里](http://stackoverflow.com/questions/2984888/check-if-file-has-a-csv-format-with-python),虽然不是100%的溶剂,应该小心几乎所有情况下 – 2012-01-31 20:55:36

相关问题