在多个文件夹中查找最新的文件并将它们发送到其他文件夹

Finding the newest files in multiple folders and send them to other folder

我在 Source 中有 3 个文件夹(A、B 和 C)。每个文件夹至少包含 1 个文件。我想在每个文件夹中找到最新的文件并将其发送到 Destination,其中还包含文件夹 A、B 和 C。非最新文件将移至 Archive,其中还包含文件夹 A、B 和 C。我使用了下面的代码,但我收到以下错误:NotADirectoryError: [WinError 267] The directory name is invalid: 'c:\data\AS\Desktop\Source\A\12.txt'

这是我的代码:

from datetime import datetime,timedelta
import shutil, os, os.path
import time

#Make Source, Destination and Archive paths.
source = r'c:\data\AS\Desktop\Source'
destination = r'c:\data\AS\Desktop\Destination'
archive = r'c:\data\AS\Desktop\Archive'

#First os.walk for the source folder itself
for root, dirs, files in os.walk(source):
    for folder in dirs:
        subdir=root+'\'+folder
        #second os.walk for each folder in the source folder (A, B, and C)
        for subroot, subdirs, subfiles in os.walk(subdir):
            for file in subfiles:
                filePath=subroot+'\'+file
                maxi = max(os.listdir(filePath), key=os.path.getctime)
                print(maxi)

我也想知道key=os.path.getctime中的key代表什么。提前谢谢大家

您收到的错误是这一行的结果:

maxi = max(os.listdir(filePath), key=os.path.getctime)

您不需要为文件夹 A、B 和 C 执行第二个 os.walk 函数。执行此操作时,您为变量 filePath 分配了完整的文件路径。然后,当您将 filePath 传递给 max() 函数时,它会抛出您看到的错误,因为它需要一个文件夹。您应该将 A、B 和 C 文件夹的路径传递给 max() 函数,而不是单个文件的路径。您应该能够摆脱第二个 os.walk 结构。像这样:

for root, dirs, files in os.walk(source):
for folder in dirs:
    subdir=root+'\'+folder
    maxi = max(os.listdir(subdir), key=os.path.getctime)
    print(maxi)

此外,key=os.path.getctime 告诉 max() 函数使用文件的创建时间戳来确定最大值。所以你是说给我看最大文件,其中最大文件定义为最近创建的时间。

如果您的目标只是移动 source 下一级子目录中的文件,那么您不想使用 os.walk()。这是一个递归遍历,将枚举根目录下的所有 directories/files。相反,使用 os.listdir(),它只会列出直接的子目录和文件。另请注意,os.path.getctime() 需要完整的 路径 并且仅在 os.listdir().

返回的文件名下将不起作用
import os
import os.path

src = 'src'
dst = 'dst'
arc = 'arc'

for subdir in os.listdir(src):
    subdir_path = os.path.join(src, subdir)
    if not os.path.isdir(subdir_path):
        # Only consider directories (a, b, c, ...) under src; skip files.
        continue

    # Get a list of absolute paths of _files_ in the sub-directory.
    subfile_paths = [os.path.join(subdir_path, f) for f in os.listdir(subdir_path)]
    subfile_paths = [p for p in subfile_paths if os.path.isfile(p)]

    if len(subfile_paths) == 0:
        # Skip empty sub-directories.
        continue

    newest_path = max(subfile_paths, key=os.path.getctime)

    for subfile_path in subfile_paths:
        if subfile_path == newest_path:
            dst_root = dst
        else:
            dst_root = arc

        dst_path = os.path.join(dst_root, subdir, os.path.basename(subfile_path))
        os.rename(subfile_path, dst_path)