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

64

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

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

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

Вы на * NIX? Skurmedel
@Mark: да, используйтеguess_extensionно на самом деле mimetypes здесь не будут работать, потому что они основаны на расширениях файлов. Им нужен libmagic (см. 2-й ответ по ссылке). georg
отн:stackoverflow.com/questions/43580/… georg
@ thg435, если у вас есть тип MIME, есть ли способ преобразовать его в подходящее расширение имени файла? Mark Ransom
Вы должны быть более конкретными в отношенииfile types, Вы хотите определить, является ли это GIF, PNG, BMP или JPG? Вы просто хотите знать, является ли это текстовым / двоичным файлом? Исполняемые? JoeFish

Ваш Ответ

8   ответов
6
import subprocess
p = sub.Popen('file yourfile.txt',stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()
print output

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

@MarkRansom извините, что это не был хороший способ, пожалуйста, смотрите мои обновления выше
И как вы захватываете вывод?
Если вам нужно взаимодействовать с вашей системой вместо использования библиотеки Python, решение в большинстве случаев является неоптимальным, поскольку оно, вероятно, бесполезно в других операционных системах с другим API.
3

В более новой библиотеке подпроцессов теперь можно использовать следующий код (только решение * 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])?
Спасибо за ответ. Кстати, вы не должны использовать str.split () в строке cmd. используйте shlex.split (cmd). emnoor
Спасибо, что указали на это @emnoor. Код обновлен.
51

Магия питона Библиотека предоставляет необходимую вам функциональность.

Вы можете установить библиотеку с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 под капотом, который является той же библиотекой, используемой * NIXfile команда. Таким образом, это делает то же самое, что и ответы на основе подпроцесса / оболочки, но без этих накладных расходов.

Помните, что пакет debian / ubuntu, называемый python-magic, отличается от пакета pip с тем же именем. Обаimport magic но имеют несовместимое содержимое. Увидетьstackoverflow.com/a/16203777/3189 для большего.
@Richard Вы не возражаете остановиться на аспекте накладных расходов? Что делаетpython-magic библиотека более эффективна, чем использование подпроцессов?
3

В случае изображений вы можете использовать модуль 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

6

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

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

1

Работает только для Linux, но с использованием & quot; sh & quot; Модуль Python вы можете просто вызвать любую команду оболочки

https://pypi.org/project/sh/

pip install sh

import sh

sh.file("/root/file")

Выход: / root / file: текст ASCII

10

На Unix и Linux естьfile Команда угадать типы файлов. Там даже естьпорт windows.

Отсправочная страница:

File tests each argument in an attempt to classify it. There are three sets of tests, performed in this order: filesystem tests, magic number tests, and language tests. The first test that succeeds causes the file type to be printed.

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

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

+1 я не понялfile сделал так много# file arc.gif arc.gif: GIF image data, version 89a, 234 x 269
Ну, я надеялся, что у кого-то был лучший ответ. Для OP все еще много работы, это не простой вызов функции.
+1 Одно преимущество с использованиемfile это то, что он является родным (для большинства) дистрибутивов Linux, в то время какpython-magic не загружается и не устанавливается, прежде чем его можно будет использовать. Это является некоторой проблемой, если сценарий, использующий модуль, должен быть переносимым.
68

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

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

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

Посылкаpython-magic-win64 у меня работал в винде
Кажется, мне придется написать функцию сif-else сам с этим модулем. Спасибо :) emnoor

Похожие вопросы