簡體   English   中英

Python檢查gzip壓縮的文件是xml還是csv

[英]Python to check if a gzipped file is xml or csv

我有一個腳本可以提取各種gzip和bz2壓縮文件。 將它們插入后,我希望編寫一個腳本來寫入文件並根據其中包含的文件類型添加擴展名。

我關心的文件格式包括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。但為有效的純文本,請作為響應返回

注意:這里有部分答案但是此解決方案僅描述了csv檢查,而不是xml,txt等。

您不能可靠地區分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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM