Кто-нибудь знает, почему мой код найдет файлы только для первого элемента в списке, а не для других? то есть он будет фильтровать файлы '*a.LOG.bz2' в имени файла

l='1001'

dts_lst=list(pd.date_range(datetime.strptime('2022-03-15', '%Y-%m-%d'), Dt_now, freq='D').strftime('%Y-%m-%d')) # list of days

p1=map(lambda x, y:Path(drive / x / 'foldera' / y / 'folderb' ), dts_lst, repeat(l))

to_search=['*a.LOG.bz2', '*b.LOG.bz2', '*c.LOG.bz2' ]

for i in to_search:
    f1=map(lambda x, y:Path(x).rglob(y), p2, repeat(i))
    for i2 in f1:
        print(f"this:::{i2}")

Что такое p2? Dt_now и drive также не определены, хотя я могу догадаться, что это может быть. Кроме того, очевидно, мы не можем знать, должен ли ваш код соответствовать файлам или нет, потому что мы не знаем, как выглядит иерархия каталогов/файлов, к которой вы применяете этот код.

CryptoFool 19.03.2022 03:01

@ Джино Мемпин, это на самом деле P1, там была строка (P2 = P1), у меня были проблемы с исправлением кода в стеке, который все еще был новым для переполнения стека. dt_now — это datetime.now(). В любом случае, добавление списка в <p1=list(map(lambda x, y:Path(drive / x / 'foldera' / y / 'folderb' ), dts_lst, repeat(l)))> сработало

Faheem Khan 19.03.2022 04:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что p2 должен быть p1 или иначе является map объектом, похожим на p1, тогда я вижу вашу проблему. Он начинается с этой строки:

p1=map(lambda x, y:Path(drive / x / 'foldera' / y / 'folderb' ), dts_lst, repeat(l))

Это создает объект map, который является своего рода итератором. После того, как вы создали один из них, вы обращаетесь к нему, как к любому другому итератору, и он выдает вам серию значений, пока не достигнет конца любой последовательности, которую он должен предоставить.

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

Самый простой способ исправить ваш код — создать список из объекта map, который вы назначаете p1:

p1=list(map(lambda x, y:Path(drive / x / 'foldera' / y / 'folderb' ), dts_lst, repeat(l)))

Вы можете перебирать list несколько раз, так что это работает нормально. Другим вариантом было бы поместить вычисление p1 внутри вашего цикла, чтобы вы каждый раз создавали новый объект map в своем цикле:

l='1001'

dts_lst=list(pd.date_range(datetime.strptime('2022-03-15', '%Y-%m-%d'), Dt_now, freq='D').strftime('%Y-%m-%d')) # list of days
    
to_search=['*a.LOG.bz2', '*b.LOG.bz2', '*c.LOG.bz2' ]

for i in to_search:
    p1=map(lambda x, y:Path(drive / x / 'foldera' / y / 'folderb' ), dts_lst, repeat(l))
    p2 = p1  # ????
    f1=map(lambda x, y:Path(x).rglob(y), p2, repeat(i))
    for i2 in f1:
        print(f"this:::{i2}")

В стороне... Вам не нужны итераторы repeat() здесь. Вы можете просто позволить своим функциям lambda принимать один параметр, а затем ссылаться непосредственно на значение, которое вы передавали repeat():

p1=map(lambda x:Path(drive / x / 'foldera' / l / 'folderb' ), dts_lst)

f1=map(lambda x:Path(x).rglob(i), p2)

Спасибо, перечисление функции карты сработало. К вашему сведению: я сканирую удаленный каталог на наличие определенных файлов. Структура каталогов: "/A/date/range(1-100)/files". запись файлов (только имена и дата) помещается в базу данных postgres. при сканировании каталога на наличие новых файлов я нажимаю список, т.е. i2 в приведенном выше коде, в db. если имя файла уже существует в базе данных, т.е. при конфликте, имя файла сохраняется в третьем столбце таблицы записей, которую я запрашиваю в списке Python, т.е. списке A. Тогда, если файлы, которые я отфильтровал, не существуют в списке A, обработайте его, иначе он пройдет.

Faheem Khan 19.03.2022 05:01

Вкратце: 1) сканируйте каталог на наличие новых файлов 2) отправьте имя файла в базу данных, которая в случае конфликта сохранит имена в отдельном столбце 3) запросите столбец конфликта в список python, т.е. список A 4) в python обрабатывают только те файлы, которые нет в списке listA

Faheem Khan 19.03.2022 05:03

Другие вопросы по теме