2012-01-31 9 views
1

私は様々なgzipとbz2圧縮ファイルをプルするスクリプトを持っています。私はそれらを引っ張った後、私はファイルを記述し、内に含まれているファイルの種類に基づいて拡張子を追加するスクリプトを書くことを探しています。Pythonはgzippedファイルがxmlかcsvかどうかを確認します

私が心配しているファイル形式にはxml、csv、およびtxtファイルが含まれていますが、csvファイルとtxtファイルの間の区別は心配していません。

私はpython-magicライブラリを使用して、使用する圧縮解除ライブラリ(bz2とgzip)を判断しましたが、ファイルタイプを判別する最も簡単な方法を知りたいと思っています。 python-magicを使って私は:

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

私の現在の計画は、各ファイルの最初の行を読み込み、それに基づいて判断することです。簡単な方法がありますか?

私が最初にこの質問に語ったのは、私が最初にこの質問に語ったことです。 ファイルが有効なXMLかどうかをチェックし、有効なCSVかどうかをチェックしますそれが有効なCSVではなく、有効なプレインテキストは、応答として

注ことを返すことです。そこの部分的な答えhereだったが、このソリューションは、あなたがすることはできませんCSVチェックではなく、XML、TXTなど

答えて

5

を説明次のファイルは有効なXMLと有効なCSVドキュメントの両方であるため、XMLとcsvを確実に区別できます。

<r>,</r> 

したがって、ヒューリスティックを適用することができます。たとえば、最初の文字が<の場合はxmlを返し、それ以外の場合はcsvを返します。

同様に、すべてのCSVファイルとXMLファイルも有効なプレーンテキストファイルです。

ファイルが有効なXML文書またはCSV文書を構成しているかどうかを確認するには、単純に解析できます。 、私はあなたのかなり明白応答が与えることについて考えていませんでした十分な

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

フェア:あなたは、パフォーマンスのために外出する場合、単にsaxまたはcsv.readerの項目を無視することによって、例えば、実際のドキュメントツリーの構築を、スキップ有効なCSV/XMLです。私の元の質問は幾分不完全で、私は質問を編集して私が探しているものをより正確に示すようにします –

+0

@SamJohnson入力が有効なXMLかどうか、そしてそれが有効なCSVかどうかをチェックするソリューションで更新されました。 – phihag

+1

csvとtextのソリューションは、私がテストしたいくつかのファイルでは動作していないようです。代わりに、私は100%溶媒ではありませんが、注意を払う必要があるソリューション[ここ](http://stackoverflow.com/questions/2984888/check-if-file-has-a-csv-format-with-python)を使用しましたほとんどすべての症例の –

関連する問題