我正在尝试在网络驱动器之间移动多个大文件夹(> 10 Gb、> 100 个子文件夹、> 2000 个文件)。我尝试过在 python 中使用 Shutil.copytree 命令,它工作得很好,只是由于不同的原因它无法复制一小部分(< 1% 的文件)。
我相信 robocopy 对我来说是最好的选择,因为我可以创建一个记录传输过程的日志文件。然而,由于我需要复制 > 1000 个文件夹,手动工作是不可能的。
所以我的问题本质上是如何从 python 脚本中调用 robocopy (即命令行),确保日志文件写入外部文件中。
我正在 Windows 7 环境中工作,由于组织限制,Linux/Unix 是不可能的。如果有人有任何其他建议来批量复制如此多的文件夹并具有很大的灵活性,欢迎他们。
以下是如何在 Python 脚本中使用
subprocess
模块调用 Robocopy 来批量复制多个文件夹的方法,以及如何编写日志文件:
import subprocess
import os
def robocopy_folders(source_folders, destination_folder, log_file):
"""
使用 Robocopy 复制多个文件夹,并将输出记录到文件中。
Args:
source_folders: 要复制的源文件夹列表。
destination_folder: 目标文件夹。
log_file: 用于写入日志的完整路径文件名。
"""
# Robocopy 选项
# /E: 复制子目录,包括空目录。
# /Z: 在可重启模式下复制文件。
# /NP: 不显示复制过程中的进度。
# /R:n: 设置重试失败复制操作的次数。
# /W:n: 设置重试失败复制操作前的等待时间(以秒为单位)。
# /LOG+: 将输出追加到日志文件。
robocopy_options = "/E /Z /NP /R:5 /W:10 /LOG+:"
with open(log_file, "a") as f:
for folder in source_folders:
source = os.path.join(folder)
destination = os.path.join(destination_folder, os.path.basename(folder))
command = f"robocopy \"{source}\" \"{destination}\" {robocopy_options}\"{log_file}\""
subprocess.run(command, shell=True, stdout=f, stderr=f)
# 示例用法
source_folders = [
"C:\\folder1",
"C:\\folder2",
"C:\\folder3"
]
destination_folder = "D:\\backup"
log_file = "D:\\robocopy_log.txt"
robocopy_folders(source_folders, destination_folder, log_file)
代码说明:
-
导入模块:
导入
subprocess
模块来运行命令行命令,导入os
模块来处理文件路径。 -
定义函数:
robocopy_folders
函数接收源文件夹列表、目标文件夹和日志文件路径作为参数。 -
设置 Robocopy 选项:
robocopy_options
变量存储用于 Robocopy 命令的选项。根据需要修改这些选项。 -
遍历文件夹:
使用
for
循环遍历源文件夹列表。 - 构建命令: 对于每个文件夹,构建完整的 Robocopy 命令字符串。
-
运行命令:
使用
subprocess.run()
函数执行 Robocopy 命令。shell=True
参数允许执行 shell 命令。stdout=f
和stderr=f
将标准输出和错误输出重定向到日志文件。 - 示例用法: 代码底部展示了如何使用该函数,指定源文件夹列表、目标文件夹和日志文件路径。
其他建议:
- 在运行脚本之前,请备份的数据。
-
可以根据需要调整 Robocopy 选项。有关所有选项的完整列表,请在命令提示符中运行
robocopy /?
。 - 如果出现错误,请检查日志文件以获取详细信息。
希望这可以帮助使用 Python 脚本批量复制多个文件夹。
标签:python,windows From: 13161659