Python, чтобы проверить, является ли сжатый файл XML или CSV - PullRequest
1 голос
/ 31 января 2012

У меня есть скрипт для загрузки различных сжатых файлов 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 и т. д.

1 Ответ

5 голосов
/ 31 января 2012

Вы не можете достоверно различать 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...