2012-01-31 3 views
1

다양한 gzip 및 bz2 압축 파일을 가져 오는 스크립트가 있습니다. 파일을 가져온 후에는 파일을 쓰고 그 안에 포함 된 파일 형식에 따라 확장명을 추가하는 스크립트를 작성하려고합니다.파이썬이 gzipped 파일이 xml인지 또는 csv인지 확인합니다.

내가 우려하는 파일 형식에는 csv와 txt 파일을 구분하는 것에 대해서는별로 신경 쓰지 않지만 (txt 확장자를 추가하는 것이 좋습니다) xml, csv 및 txt 파일이 포함됩니다.

필자는 python-magic 라이브러리를 사용하여 압축 풀기 라이브러리 (bz2 대 gzip)를 결정했지만 파일 형식을 결정하는 가장 쉬운 방법을 알고 싶습니다. 파이썬 매직을 사용하여 :

>>> 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

설명 다음 파일은 유효한 CSV 문서 일뿐만 아니라 올바른 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와 텍스트의 솔루션이 테스트 한 일부 파일에서 작동하지 않는 것 같습니다. 대신 나는 100 % 용매가 아니지만주의를 기울여야하는 해결책을 [여기] (http://stackoverflow.com/questions/2984888/check-if-file-has-a-csv-format-with-python) 사용했다. 거의 모든 경우의 –

관련 문제