gpt4 book ai didi

python - FOR 循环范围一次处理一定数量的文件

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:27 26 4
gpt4 key购买 nike

我有一个 for 循环,它运行一个目录并处理那里的文件,但我想一次只处理一定数量的文件。例如,我有一个包含 1000 个文件的目录,但我每天只能处理其中 250 个文件,因此我第一次运行脚本时,它会处理前 250 个文件。然后处理下一个 250 个文件,依此类推。

首先,我根据一个记录已同步文件名称的 XML 文件检查文件名,这样我就不会再次处理它们。然后我想处理接下来的 n 个文件,其中我有一个变量 synclimit = n

我考虑过将 in range 语句添加到 for 循环中,如下所示:

tree = ET.parse("sync_list.xml")
root = tree.getroot()
synced = [elt.text for elt in root.findall('synced/sfile')]
for filename in os.listdir(filepath) and in range (0, synclimit) :
if fnmatch.fnmatch(filename, '*.txt') and filename not in synced:
filename = os.path.join(filepath, filename)
result = plistlib.readPlist(filename)

但是,我很确定这每次只会检查目录中的前 n 个文件。我应该将 range 语句添加到 if 语句中吗?像:

tree = ET.parse("sync_list.xml")
root = tree.getroot()
synced = [elt.text for elt in root.findall('synced/sfile')]
for filename in os.listdir(filepath):
if fnmatch.fnmatch(filename, '*.txt') and filename not in synced and in range (0, synclimit):
filename = os.path.join(filepath, filename)
result = plistlib.readPlist(filename)

或者有更简单的方法吗?谢谢。

最佳答案

只需保留一个单独的计数器并递增该计数器,然后测试它是否已达到synclimit。就那么简单。这里没有必要变得太聪明:

processed = 0
for filename in os.listdir(filepath):
if not filename.endswith('.txt') or filename in synched:
continue
# process
processed += 1
if processed >= synclimit:
break # done for today.

或者,由于 os.listdir() 返回一个列表,如果您在一组中已经同步了文件名列表,则可以对其进行过滤,然后将其切成最大大小:

synced = set(elt.text for elt in root.findall('synced/sfile'))
to_process = [f for f in os.listdir(filepath) if f.endswith('.txt') and f not in synched]

for filename in to_process[:synclimit]:
# process

请注意,我只是测试 .endswith('.txt') 而不是使用简单的文件匹配器;测试归结为同一件事。

关于python - FOR 循环范围一次处理一定数量的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13516880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com