Как проверить тип файлов без расширений в python?

у меня есть папка, полная файлов, и у них нет расширения. Как проверить типы файлов? Я хочу проверить тип файла и, соответственно, изменить имя файла. Предположим, что функция filetype(x) возвращает тип файла, например png. Я хочу сделать это:

files = os.listdir(".")
for f in files:
    os.rename(f, f+filetype(f))

как мне это сделать?

7 ответов


есть библиотеки Python, которые могут распознавать файлы на основе их содержимого (обычно заголовок / магическое число) и которые не полагаются на имя файла или расширение.

Если вы обращаетесь ко многим различным типам файлов, вы можете использовать python-magic. Это просто привязка Python для устоявшихся magic библиотека. Это имеет хорошую репутацию и (небольшое одобрение) в ограниченном использовании, которое я сделал из него, это было солидно.

есть также библиотеки для более специализированные типы файлов. Например, стандартная библиотека Python имеет imghdr модуль, который делает то же самое, только на типы файлов изображений.


на Python Magic библиотека предоставляет необходимые функциональные возможности.

вы можете установить библиотеку с pip install python-magic и использовать его следующим образом:

>>> import magic

>>> magic.from_file('iceland.jpg')
'JPEG image data, JFIF standard 1.01'

>>> magic.from_file('iceland.jpg', mime=True)
'image/jpeg'

>>> magic.from_file('greenland.png')
'PNG image data, 600 x 1000, 8-bit colormap, non-interlaced'

>>> magic.from_file('greenland.png', mime=True)
'image/png'

код Python в этом случае вызывает libmagic под капотом, который является той же библиотекой, используемой *NIX . Таким образом, это делает то же самое, что и ответы на основе подпроцесса/оболочки, но без этих накладных расходов.


на unix и linux есть file команда для угадывания типов файлов. Есть даже порт windows.

С man page:

File проверяет каждый аргумент в попытке классифицировать его. Есть три наборы тестов, выполняемые в таком порядке: тесты файловой системы, магический номер тесты и языковые тесты. Первый успешный тест вызывает тип файла напечатанный.

вам нужно будет запустить с subprocess module, а затем проанализируйте результаты, чтобы выяснить расширение.

edit: игнорировать мой ответ. Используйте Chris Johnson's ответ вместо.


import subprocess
p = sub.Popen('file yourfile.txt',stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()
print output

Как заметил Стивен,subprocess путь. Вы можете получить вывод команды выше, как это в должности сказал


вы также можете установить официальные file привязка для Python, библиотека под названием file-magic (он не использует ctypes, как python-magic).

Он доступен на PyPI как и на Debian как python-magic. Для меня эта библиотека является лучшей в использовании, так как она доступна на PyPI и Debian (и, возможно, других дистрибутивах), что упрощает процесс развертывания вашего программного обеспечения. Я расказывает о том, как его использовать, также.


в случае изображений можно использовать модуль imghdr.

>>> import imghdr
>>> imghdr.what('8e5d7e9d873e2a9db0e31f9dfc11cf47')  # You can pass a file name or a file object as first param. See doc for optional 2nd param.
'png'

Python 2 imghdr doc
Python 3 imghdr doc


С новой библиотекой подпроцессов теперь можно использовать следующий код (*Nix только решение):

import subprocess
import shlex

filename = 'your_file'
cmd = shlex.split('file --mime-type {0}'.format(filename))
result = subprocess.check_output(cmd)
mime_type = result.split()[-1]
print mime_type