在多个文件夹中查找最新的文件并将它们发送到其他文件夹
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)
我在 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)