LINUX.ORG.RU

Глюки при создании списка

 list comprehension,


0

1

Запускаю такую последовательность команд:

import os

stoplist = [os.path.expanduser('~') + '/.cache/', os.path.expanduser('~') + '/.mozilla/']

def is_in_stoplist(a):
    for e in stoplist:
        if a.startswith(e): return True
    return False

filelist = [ os.path.join(r, f) for r, d, files in os.walk(os.path.expanduser('~')) for f in files if not is_in_stoplist(f) ]

Она должна составить список всех файлов в домашней директории вне ~/.cache и ~/.mozilla

Затем делаю len([f for f in filelist if f.startswith(stoplist[1])]) и получаю ~3000.

Повторное filelist = [f for f in filelist if not is_in_stoplist(f)] убирает все вхождения ~/.mozilla и ~/.cache.

Почему при первом прогоне не срабатывает?

Ответ: потому что в этой точке f — только часть имени. Или нужно вызывать is_in_stoplist(os.path.join(r, f)), или вообще фильтровать сразу root:

import os

stoplist = [os.path.expanduser('~') + '/.cache', os.path.expanduser('~') + '/.mozilla']

def is_in_stoplist(a):
    for e in stoplist:
        if a.startswith(e): return True
    return False

filelist = [ os.path.join(root, f) for root, d, files in os.walk(os.path.expanduser('~')) if not is_in_stoplist(root) for f in files ]
★★★★★

Последнее исправление: question4 (всего исправлений: 2)

Попробуй так

filelist = [ os.path.join(r, f) for r, d, files in os.walk(os.path.expanduser('~')) for f in files if not is_in_stoplist(os.path.join(r, f)) ]

Иначе ты проверяешь только имя файла без полного пути на наличие префикса /home/question4/.cache, который к нему добавишь только после прохождения проверки. Вообще вложенные генераторы штука опасная, если переписать в цикл проблема будет видна сразу

grazor ★★
()
Ответ на: комментарий от eternal_sorrow

Предложи нормальный вариант кода.

Или реши сверхзадачу — найти все группы идентичных файлов на диске за пределами кешей, директорий WINEPREFIX и т.п.

question4 ★★★★★
() автор топика
Ответ на: комментарий от bga_

Jdupes?

Спасибо. А она умеет искать одинаковые картинки, отличающиеся разрешением раз в 10? (300х400 против 3000х4000.)

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

А какие у вас критерии идентичности?

Ниже увидел, что «одинаковые картинки с разным разрешением». И как это технически планируете делать?

Хочется иметь приблуду для решения похожей задачи - найти и убрать дубликаты файлов. Под дубликатами подразумевал одинаковые побайтно с одинаковым названием, но лежащие в разных каталогах или в архиве.

blex ★★★
()
Ответ на: комментарий от blex

Хочется иметь приблуду для решения похожей задачи - найти и убрать дубликаты файлов. Под дубликатами подразумевал одинаковые побайтно с одинаковым названием, но лежащие в разных каталогах или в архиве.

fdupes и jdupes делают именно это, но без чтения архивов, как я понял.

«одинаковые картинки с разным разрешением». И как это технически планируете делать?

Есть ряд утилит. Пока пробовал только compare из ImageMagic. Если ничего не устроит, есть алгоритм, который уменьшает картинки до 20х20 и сравнивает.

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

Спасибо за названия утилит. Буду пробовать.

blex ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.