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