首页 > 编程问答 >如何在 python 脚本中调用 robocopy 来批量复制多个文件夹?

如何在 python 脚本中调用 robocopy 来批量复制多个文件夹?

时间:2024-07-21 06:00:37浏览次数:12  
标签:python windows

我正在尝试在网络驱动器之间移动多个大文件夹(> 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)

代码说明:

  1. 导入模块: 导入 subprocess 模块来运行命令行命令,导入 os 模块来处理文件路径。
  2. 定义函数: robocopy_folders 函数接收源文件夹列表、目标文件夹和日志文件路径作为参数。
  3. 设置 Robocopy 选项: robocopy_options 变量存储用于 Robocopy 命令的选项。根据需要修改这些选项。
  4. 遍历文件夹: 使用 for 循环遍历源文件夹列表。
  5. 构建命令: 对于每个文件夹,构建完整的 Robocopy 命令字符串。
  6. 运行命令: 使用 subprocess.run() 函数执行 Robocopy 命令。 shell=True 参数允许执行 shell 命令。 stdout=f stderr=f 将标准输出和错误输出重定向到日志文件。
  7. 示例用法: 代码底部展示了如何使用该函数,指定源文件夹列表、目标文件夹和日志文件路径。

其他建议:

  • 在运行脚本之前,请备份的数据。
  • 可以根据需要调整 Robocopy 选项。有关所有选项的完整列表,请在命令提示符中运行 robocopy /?
  • 如果出现错误,请检查日志文件以获取详细信息。

希望这可以帮助使用 Python 脚本批量复制多个文件夹。

标签:python,windows
From: 13161659

相关文章

  • 如何在Python中使用装饰器动态创建类方法?
    我正在开发一个Python项目,我需要在运行时动态地为类创建方法。我想使用装饰器根据一些外部配置将这些方法添加到类中。要求是:装饰器应该从外部配置(例如字典)读取方法定义。装饰器应该动态地将这些方法添加到类中。每个生成的方法都应具有配置中指定的自己唯一的实现。以......
  • python 中的可扩展视频文件完整性验证
    我的目录包含约100万个视频文件,嵌套在100个子目录下。我想编写一个python脚本来验证这些文件没有损坏,然后删除损坏的文件。做到这一点最有效的方法是什么?它运行的机器有64个cpu核心。当然,以下是如何在Python中构建可扩展视频文件完整性验证器的步骤,该验证器可以......
  • Python:对很高维的矩阵进行对角化?
    目前我正在研究一个涉及对角化矩阵以获得特征值和特征向量的问题。但现在我想将问题扩展到200,000x200,000的尺寸。我查找了如何将矩阵存储在numpy中,有人建议使用PyTables。看起来很有希望。但我想知道哪里有工具可以帮助对PyTables中的矩阵存储进行对角化。......
  • 除了curses之外,是否有一个python包可以轻松控制终端的输出?
    我现在正在处理一些小项目,我对GUI的偏好是终端中漂亮的文本界面。我宁愿不强迫用户处理Windowscurses二进制文件,所以我正在寻找不同的选项。我已经发现了asciimatics,但我想考虑所有可能的选择。如果有人有任何经验或知道解决此用例的包,我将不胜感激。谢谢你说的没错......
  • 当值来自函数 python unittest 时,如何模拟全局变量
    我必须在python中模拟全局变量,但变量值来自另一个函数。当我导入文件时,这个函数正在运行,但我想要那里的模拟值。secrets.pyimporttracebackimportloggingimportboto3importosimportjsonlogger=logging.getLogger()logger.setLevel(logging.INFO)secret_......
  • 使用 python print 和 gdb 时出现 BrokenPipeError
    我正在尝试在Linux中运行应用程序并使用Python生成输入:python3-c'print(".....")'|./someapp但出现下一个错误:Exceptionignoredin:<_io.TextIOWrappername='<stdout>'mode='w'encoding='utf-8'>BrokenPipeError:......
  • python 舰队容器
    我正在尝试使用容器在flet中制作一个菜单,它应该是半透明的,但其中的项目不是。我尝试将opacity=1分配给元素,但没有成功-它们与容器一样透明感谢任何帮助我的代码:nickname=ft.TextField(label="xxx",hint_text="xxx")column=ft.Column(controls=[nickname......
  • Python应用程序跨子包共享的配置文件
    我正在构建一个应用程序来控制一些硬件。我在包中实现了不同类型的硬件:电机和测量设备。我的文件结构如下:name_of_my_app/__init__.pymain.pyconfig.iniCONFIG.pymotors/__init__.pyone_kind_of_motor.pymeasurement_devices/......
  • python中时间序列数据的梯度计算
    我正在尝试编写一个函数,它可以从最适合下面的线返回梯度dataframe在浏览了谷歌的几个资源之后,我仍然不确定这是如何完成的。我明白最佳拟合线的计算公式为:y=mx+b将因变量(y)设置为foos,将自变量(x)设置为DateTimeDatafram......
  • 调试用 C 编写的 Python 扩展
    我非常熟悉编写C代码,并且很擅长编写Python代码。我正在尝试学习如何用C编写可以从OSX10.15.7上的Python-3.9.X调用的模块。我已经得到了几个“helloworld”类型的示例,但是对于复杂的示例,我正在努力弄清楚如何调试我编写的C扩展。MWE:src/add.c//......