У меня есть папка, полная файлов, и у них нет расширения. Как я могу проверить типы файлов? Я хочу проверить тип файла и соответственно изменить имя файла. Предположим, функция filetype(x)
возвращает тип файла, например png
. Я хочу сделать это:
files = os.listdir(".")
for f in files:
os.rename(f, f+filetype(f))
Как мне это сделать?
python
filesystems
identification
Emnoor
источник
источник
file types
. Вы имеете в виду определение формата GIF, PNG, BMP или JPG? Вы просто хотите знать, текст это / бинарный? Исполняемый?Ответы:
Существуют библиотеки Python, которые могут распознавать файлы на основе их содержимого (обычно заголовка / магического числа) и не зависят от имени или расширения файла.
Если вы обращаетесь к разным типам файлов, вы можете использовать
python-magic
. Это просто привязка Python к хорошо зарекомендовавшей себяmagic
библиотеке. У этого есть хорошая репутация и (небольшое одобрение) в ограниченном использовании, которое я использовал, это было твердым.Существуют также библиотеки для более специализированных типов файлов. Например, в стандартной библиотеке Python есть
imghdr
модуль, который делает то же самое только для типов файлов изображений.Если вам нужна проверка типов файлов без зависимостей (чистый Python), см
filetype
..источник
python-magic-win64
работал у меня в WindowsБиблиотека 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
file
. Таким образом, это делает то же самое, что и ответы на основе подпроцесса / оболочки, но без этих накладных расходов.источник
import magic
имеют несовместимое содержимое. См. Stackoverflow.com/a/16203777/3189 для получения дополнительной информации.python-magic
библиотеку более эффективной, чем использование подпроцессных подходов?В unix и linux есть
file
команда угадывать типы файлов. Есть даже порт windows .На странице руководства :
Вам нужно будет запустить
file
команду сsubprocess
модулем, а затем проанализировать результаты, чтобы определить расширение.изменить: игнорировать мой ответ. Вместо этого используйте ответ Криса Джонсона .
источник
file
.# file arc.gif arc.gif: GIF image data, version 89a, 234 x 269
file
команды заключается в том, что она встроена в (большинство?) Дистрибутивов Linux, в то времяpython-magic
как ее нет, и ее необходимо загрузить и установить, прежде чем ее можно будет использовать. Это в некоторой степени проблема, если сценарий, использующий модуль, должен быть переносимым.В случае изображений вы можете использовать
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
источник
Вы также можете установить официальную
file
привязку для Python, называемую библиотекойfile-magic
(она не использует ctypes, напримерpython-magic
).Он доступен в PyPI как file-magic и в Debian как python-magic . Для меня лучше всего использовать эту библиотеку, поскольку она доступна в PyPI и Debian (и, возможно, в других дистрибутивах), что упрощает процесс развертывания вашего программного обеспечения. Я тоже писал в блоге о том, как его использовать .
источник
import subprocess p = sub.Popen('file yourfile.txt', stdout=sub.PIPE, stderr=sub.PIPE) output, errors = p.communicate() print(output)
Как указал Стивен,
subprocess
это путь. Вы можете получить вывод команды указанным выше способом, как сказано в этом сообщении.источник
С новой библиотекой подпроцессов теперь вы можете использовать следующий код (решение только для * 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
источник
shlex.split
, почему бы просто не запуститьsubprocess.check_output(['file', '--mime-type', filename])
?также вы можете использовать этот код (чистый питон на 3 байта заголовочного файла):
full_path = os.path.join(MEDIA_ROOT, pathfile) try: image_data = open(full_path, "rb").read() except IOError: return "Incorrect Request :( !!!" header_byte = image_data[0:3].encode("hex").lower() if header_byte == '474946': return "image/gif" elif header_byte == '89504e': return "image/png" elif header_byte == 'ffd8ff': return "image/jpeg" else: return "binary file"
источник
Работает только для Linux, но с помощью модуля python "sh" вы можете просто вызвать любую команду оболочки.
https://pypi.org/project/sh/
pip install sh
Вывод: / root / file: текст ASCII
источник