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

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

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

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

 Mark Ransom07 июн. 2012 г., 20:14
@ thg435, если у вас есть тип MIME, есть ли способ преобразовать его в подходящее расширение имени файла?
 JoeFish07 июн. 2012 г., 20:12
Вы должны быть более конкретными в отношенииfile types, Вы хотите определить, является ли это GIF, PNG, BMP или JPG? Вы просто хотите знать, является ли это текстовым / двоичным файлом? Исполняемые?
 georg07 июн. 2012 г., 20:11
 georg07 июн. 2012 г., 20:18
@Mark: да, используйтеguess_extensionно на самом деле mimetypes здесь не будут работать, потому что они основаны на расширениях файлов. Им нужен libmagic (см. 2-й ответ по ссылке).
 Skurmedel07 июн. 2012 г., 20:07
Вы на * NIX?

Ответы на вопрос(8)

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

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

 07 июн. 2012 г., 20:26
И как вы захватываете вывод?
 17 дек. 2013 г., 17:17
Если вам нужно взаимодействовать с вашей системой вместо использования библиотеки Python, решение в большинстве случаев является неоптимальным, поскольку оно, вероятно, бесполезно в других операционных системах с другим API.
 07 июн. 2012 г., 20:47
@MarkRansom извините, что это не был хороший способ, пожалуйста, смотрите мои обновления выше

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

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

На 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:  Не обращайте внимания на мой ответ. Используйте Криса Джонсонаответ вместо.

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

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

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

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

 25 янв. 2019 г., 10:52
Посылкаpython-magic-win64 у меня работал в винде
 emnoor07 июн. 2012 г., 21:47
Кажется, мне придется написать функцию сif-else сам с этим модулем. Спасибо :)

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

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

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

В более новой библиотеке подпроцессов теперь можно использовать следующий код (только решение * 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
 03 авг. 2016 г., 09:05
Вместо того, чтобы использоватьshlex.splitпочему бы просто не бежатьsubprocess.check_output(['file', '--mime-type', filename])?
 emnoor06 июн. 2014 г., 14:14
Спасибо за ответ. Кстати, вы не должны использовать str.split () в строке cmd. используйте shlex.split (cmd).
 08 июн. 2014 г., 09:33
Спасибо, что указали на это @emnoor. Код обновлен.

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

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

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

pip install sh

import sh

sh.file("/root/file")

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

Ваш ответ на вопрос