任何人都知道为什么我的代码只能找到列表中第一个项目的文件而不是其他项目?即它将过滤文件名中的文件 '*a.LOG.bz2'
Anyone knows why my code will only find the files for the first item in the list and not others? i.e. it will filter files '*a.LOG.bz2' in filename
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
应该是 p1
,或者是一个类似于 p1
的 map
对象,那么我明白了你的问题。它从这一行开始:
p1=map(lambda x, y:Path(drive / x / 'foldera' / y / 'folderb' ), dts_lst, repeat(l))
这将创建一个 map
对象,它是一种迭代器。一旦你构建了其中一个,你就可以像访问任何其他迭代器一样访问它,它会为你提供一系列值,直到它到达它打算提供的任何序列的末尾。
你的问题是你正在迭代这个 map
对象三次。你不能那样做。第一次使用迭代器时,会用尽它的值。第一次之后,迭代器实际上位于其序列的末尾,因此继续查询它的值将导致没有返回任何值。
修复代码的最简单方法是从要分配给 p1
的 map
对象创建一个列表:
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)
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
应该是 p1
,或者是一个类似于 p1
的 map
对象,那么我明白了你的问题。它从这一行开始:
p1=map(lambda x, y:Path(drive / x / 'foldera' / y / 'folderb' ), dts_lst, repeat(l))
这将创建一个 map
对象,它是一种迭代器。一旦你构建了其中一个,你就可以像访问任何其他迭代器一样访问它,它会为你提供一系列值,直到它到达它打算提供的任何序列的末尾。
你的问题是你正在迭代这个 map
对象三次。你不能那样做。第一次使用迭代器时,会用尽它的值。第一次之后,迭代器实际上位于其序列的末尾,因此继续查询它的值将导致没有返回任何值。
修复代码的最简单方法是从要分配给 p1
的 map
对象创建一个列表:
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)