【发布时间】:2021-03-09 23:58:48
【问题描述】:
我有一个包含大约 100 万个文件的文件夹,需要分批将 300 个文件传输到暂存文件夹以上传到 S3。文件需要按照创建日期最旧 > 最新的顺序移动。
我创建了一个脚本,它可以完成我需要的所有事情,一次只做一个文件作为测试。现在我已经准备好批量做,我似乎碰壁了,因为我不知道如何一次做 300 个。
工作流程应该是这样的:
-
如果目标文件夹为空
-
在源文件夹中查找 300 个最旧的文件/如果使用循环则查找单个最旧的文件
-
将文件移动到目标文件夹
-
执行 S3 传输(删除目标中的所有文件 文件夹)
-
返回第 1 步
我宁愿一次做一批 300 个,但我找不到任何关于如何指定每个“批次”文件数量的信息,我认为有一个需要最旧的第一个的附加功能会使事情复杂化,所以我相信一个循环是有序的
下面的代码将一次将最旧的文件从源文件夹移动到目标文件夹 1
import os
import glob
import shutil
src = "Source Folder"
dst = "Destination Folder"
def oldest_file_in_tree(rootfolder, extension=".xml"):
return min(
(os.path.join(dirname, filename)
for dirname, dirnames, filenames in os.walk(rootfolder)
for filename in filenames
if filename.endswith(extension)),
key=lambda fn: os.stat(fn).st_mtime)
oldest_xml = oldest_file_in_tree("Source Folder", '.xml')
shutil.move(oldest_xml, dst)
我尝试了几种不同的循环/if 语句 - 它们似乎只复制一个文件然后完成,例如:
if files_in_dst <= 11:
shutil.move(oldest_xml, dst)
dstCount = 0
for files in src:
dstCount += 1
shutil.move(oldest_xml, dst)
if dstCount == 11:
break
dstFolderCount = sum(len(files)for _, _, files in os.walk(dst))
while dstFolderCount < 11:
oldest_xml = oldest_file_in_tree(Source Folder", '.xml')
shutil.move(oldest_xml, dst)
我认为我缺少的步骤是如何真正让循环进行迭代,所以如果有任何阅读/建议 - 我全神贯注。
【问题讨论】:
-
您上一个代码中的
dstFolderCount是什么? -
抱歉,遗漏了一些代码,我已经编辑了帖子。
-
计算
dstFolderCount中文件数量的方式,它计算目标文件夹中的文件夹和子文件夹。目标文件夹中除了这些文件之外还有其他文件吗? -
不,它只有 xml 文件,一旦每批文件上传到 S3,它们就会从目标文件夹中删除,基本上每个周期都“空”
-
您能否在上一个示例中将您的 while 语句替换为
while len(glob.glob1(dst,"*.xml")) < 301:
标签: python-3.x shutil