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}")
@ Джино Мемпин, это на самом деле P1, там была строка (P2 = P1), у меня были проблемы с исправлением кода в стеке, который все еще был новым для переполнения стека. dt_now — это datetime.now(). В любом случае, добавление списка в <p1=list(map(lambda x, y:Path(drive / x / 'foldera' / y / 'folderb' ), dts_lst, repeat(l)))
> сработало
Предполагая, что 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, обработайте его, иначе он пройдет.
Вкратце: 1) сканируйте каталог на наличие новых файлов 2) отправьте имя файла в базу данных, которая в случае конфликта сохранит имена в отдельном столбце 3) запросите столбец конфликта в список python, т.е. список A 4) в python обрабатывают только те файлы, которые нет в списке listA
Что такое
p2
?Dt_now
иdrive
также не определены, хотя я могу догадаться, что это может быть. Кроме того, очевидно, мы не можем знать, должен ли ваш код соответствовать файлам или нет, потому что мы не знаем, как выглядит иерархия каталогов/файлов, к которой вы применяете этот код.