получение и установка меток для поиска файлов Mac и папок из Python - PullRequest
7 голосов
/ 30 ноября 2011

Я пытался выяснить, как получить и установить цвет меток файлов из python.

Самое близкое, что я нашел к решению, было это , но я не могу найти ни одного файла macfile модуля.Я просто не выгляжу достаточно усердно?

Есть ли другой способ добиться этого, если нет?

Ответы [ 3 ]

11 голосов
/ 30 ноября 2011

Вы можете сделать это в python, используя модуль xattr .

Вот пример, взятый в основном из этого вопроса :

from xattr import xattr
from struct import unpack

colornames = {
    0: 'none',
    1: 'gray',
    2: 'green',
    3: 'purple',
    4: 'blue',
    5: 'yellow',
    6: 'red',
    7: 'orange',
}

attrs = xattr('./test.cpp')

try:
    finder_attrs = attrs[u'com.apple.FinderInfo']
    flags = unpack(32*'B', finder_attrs)
    color = flags[9] >> 1 & 7
except KeyError:
    color = 0

print colornames[color]

Поскольку я окрасил этот файл красной этикеткой, для меня это напечатано 'red'.Вы можете использовать модуль xattr для записи новой метки обратно на диск.

4 голосов
/ 16 марта 2013

Если вы переходите по ссылке favoretti и затем прокручиваете немного вниз, есть ссылка на https://github.com/danthedeckie/display_colors,, которая делает это через xattr, но без бинарных манипуляций.Я немного переписал его код:

from xattr import xattr

def set_label(filename, color_name):
    colors = ['none', 'gray', 'green', 'purple', 'blue', 'yellow', 'red', 'orange']
    key = u'com.apple.FinderInfo'
    attrs = xattr(filename)
    current = attrs.copy().get(key, chr(0)*32)
    changed = current[:9] + chr(colors.index(color_name)*2) + current[10:]
    attrs.set(key, changed)

set_label('/Users/chbrown/Desktop', 'green')
0 голосов
/ 22 июля 2013

Модуль macfile является частью модуля appscript и был переименован в mactypes в "2006-11-20 - 0.2.0"

Используя этот модуль, здесь есть две функции для получения и установки меток искателя с помощью appsScript версии 1.0:

from appscript import app
from mactypes import File as MacFile


# Note these label names could be changed in the Finder preferences,
# but the colours are fixed
FINDER_LABEL_NAMES = {
    0: 'none',
    1: 'orange',
    2: 'red',
    3: 'yellow',
    4: 'blue',
    5: 'purple',
    6: 'green',
    7: 'gray',
}


def finder_label(path):
    """Get the Finder label colour for the given path

    >>> finder_label("/tmp/example.txt")
    'green'
    """
    idx = app('Finder').items[MacFile(path)].label_index.get()
    return FINDER_LABEL_NAMES[idx]


def set_finder_label(path, label):
    """Set the Finder label by colour

    >>> set_finder_label("/tmp/example.txt", "blue")
    """

    label_rev = {v:k for k, v in FINDER_LABEL_NAMES.items()}

    available = label_rev.keys()
    if label not in available:
        raise ValueError(
            "%r not in available labels of %s" % (
                label,
                ", ".join(available)))

    app('Finder').items[MacFile(path)].label_index.set(label_rev[label])

if __name__ == "__main__":
    # Touch file
    path = "blah"
    open(path, "w").close()

    # Toggle label colour
    if finder_label(path) == "green":
        set_finder_label(path, "red")
    else:
        set_finder_label(path, "green")
...