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


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

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

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

7 54

7 ответов:

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

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

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

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

С на странице:

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

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

edit: игнорировать мой ответ. Используйте Криса Джонсона ответ вместо.

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

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

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

Он доступен на PyPI как file-magic а в 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