Получить тип файла (не расширение) в файловой системе MacOSX с помощью Python

Какие библиотеки Python можно использовать для получения подробных атрибутов файлов в файловой системе MacOSX? У меня есть подозрение, что он использует модуль os, но я не смог получить доступ к этим атрибутам через python.

Самым важным атрибутом, к которому я хочу получить доступ, будет тип файла. Обратите внимание, что я говорю не о расширении, а о 4-м столбце на скриншоте ниже (взято из этот вопрос суперпользователя). Например, когда я перебираю эти файлы в этом каталоге, как я могу получить «Обычный текстовый документ» в качестве типа для license.txt? Мое приложение представляет собой сценарий обработки файлов, который должен отличать каталоги от файлов пакетов keynote/pages/numbers.

Примечание о дублировании:

Также обратите внимание, что я видел этот конкретный вопрос SO, что относится к общим файловым системам *nix. Мой вопрос является подмножеством этого вопроса для файловых систем MacOS, которые могут иметь некоторые особенности, не обсуждаемые в этом вопросе. Если пользователь может предоставить пример того, как КАК python-magic можно использовать для получения типа файла, это будет более полезным решением, чем вышеупомянутая статья.

введите здесь описание изображения


person Thomas Matthew    schedule 03.05.2018    source источник
comment
Это помогает? stackoverflow.com/questions/1974724/   -  person PM 2Ring    schedule 03.05.2018
comment
Если вы просто хотите различать простые файлы и каталоги, см. раздел os.path.isfile и os.path.isdir. См. также Path.is_dir.   -  person PM 2Ring    schedule 03.05.2018
comment
@ PM2Ring Я не уверен, как использовать эту статью SO, которую вы мне прислали, для моей конкретной цели - это займет некоторое время, чтобы понять. os.path.isfile и os.path.isdir не работают, потому что файлы пакетов, которые я использую, неправильно воспринимаются как каталоги, и я хочу обрабатывать эти типы файлов, а НЕ фактические каталоги, поэтому вместо этого мне приходится полагаться на тип файла.   -  person Thomas Matthew    schedule 03.05.2018
comment
Извините, я не так хорошо знаком с MacOSX. file — это стандартная команда *nix, о ней можно прочитать здесь. Я предполагаю, что у Mac есть file, хотя Mac делает некоторые особые вещи с тем, как он обрабатывает файлы.   -  person PM 2Ring    schedule 03.05.2018
comment
Также см. stackoverflow.com/a/1974737/1110636   -  person Timir    schedule 03.05.2018
comment
Возможный дубликат Есть ли python-эквивалент unix файловая утилита?   -  person Timir    schedule 03.05.2018


Ответы (1)


Вы можете получить дату последнего изменения и размер файла за один раз из os.stat().

Тип файла более сложен, так как есть как минимум два разных способа получить удобочитаемое описание из ОС. Для этого вам нужна библиотека pyobjc, которая позволит вам а) запрашивать NSWorkspace и LaunchServices для данных, связанных с UTI, или б) создавать NSURL для отдельных файлов и запрашивать их для их типа ресурса. Я считаю, что б) ближе к тому, что делает Finder.

Вот пример, иллюстрирующий оба этих метода:

from AppKit import NSWorkspace
from LaunchServices import UTTypeCopyDescription

from Cocoa import NSURL, NSURLLocalizedTypeDescriptionKey

from datetime import datetime
import os

for f in os.listdir("."):
    uti = NSWorkspace.sharedWorkspace().typeOfFile_error_(f, None)[0]
    desc = UTTypeCopyDescription(uti)

    url = NSURL.fileURLWithPath_(f)
    urlType = url.getResourceValue_forKey_error_(None, NSURLLocalizedTypeDescriptionKey, None)[1]

    sr = os.stat(f)
    size = sr.st_size
    date = datetime.fromtimestamp(sr.st_mtime).strftime('%Y-%m-%d %H:%M:%S')

    print("%-20s size=%s modified=%s uti=%s desc=%s url=%s" % (f, size, date, uti, desc, urlType))
person snowcat    schedule 03.05.2018