Как проверить тип файлов без расширений в 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'
С новой библиотекой подпроцессов теперь можно использовать следующий код (*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