首页 > 解决方案 > 如果文件夹中的文件数少于 x,则将更多文件复制到文件夹

问题描述

我有一个包含大约 100 万个文件的文件夹,需要将 300 个文件分批传输到暂存文件夹以上传到 S3。需要按照创建日期最旧 > 最新的顺序移动文件。

我创建了一个脚本,它可以做我需要的一切,一次只做一个文件作为测试。现在我准备好批量做,我似乎碰壁了,因为我不知道如何一次做 300 个。

工作流程应该是这样的:

  1. 如果目标文件夹为空

  2. 在源文件夹中查找 300 个最旧的文件/如果使用循环则查找单个最旧的文件

  3. 将文件移动到目标文件夹

  4. 执行 S3 传输(删除目标文件夹中的所有文件)

  5. 返回步骤 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)

我认为我缺少的步骤是如何真正让循环迭代,所以如果有任何阅读/建议 - 我全神贯注。

标签: python-3.xshutil

解决方案


感谢@BijayRegmi

简短的答案是使用 Blob 来计算目录中的文件,然后执行 while 循环。

while len(glob.glob1(Destination Folder,"*.xml")) < 5:
    try:
        #Insert Code Here#
    except(FileExistsError):
        print("File Exists")

推荐阅读