【问题标题】:Copy large list of files from one location to another将大量文件从一个位置复制到另一个位置
【发布时间】:2015-01-30 18:50:55
【问题描述】:

(使用 Python 3.4.2) 我正在尝试将不同位置的 8,000 多个文件的列表复制到暂存目录。 源路径类似于 D:\dir\img0\000 和目标路径 D:\stage2\NW000.tif。

据我所知,shutil 可以解决这个问题,我在网上找到了一个简单的例子,我一直在努力适应我的工作目的。我已将源路径和目标路径的 8,000 多条记录保存在两个单独的文本文件中,每个目录路径后都有换行符。我希望变量 src 和 dst 存储列表的所有值,并希望 shutil.copy 将文件复制到新的目的地。我一直在尝试通过创建 1 个源文件夹和 3 个目标来测试代码。文件夹:Test、TestA、TestB、TestC。我创建了两个带有路径列表的文本文件,它们的外观如下:

(source.txt)
C:\Users\user1\Desktop\Test\t1.txt
C:\Users\user1\Desktop\Test\t2.txt
C:\Users\user1\Desktop\Test\t3.txt

(dest.txt)
C:\Users\user1\Desktop\TestA\1t.txt
C:\Users\user1\Desktop\TestB\2t.txt
C:\Users\user1\Desktop\TestC\3t.txt

我将两个列表文本文件、三个虚拟文本文件和脚本保存在测试目录中并执行了脚本,但我没有在目标目录中找到文件。我想知道为什么这个脚本不起作用(将源文件、目标文件和脚本文件放在哪里,以便脚本正确执行)。:

import shutil
import errno

file = open('source.txt', 'r')
source = file.readlines()
file = open('dest.txt', 'r')
destination = file.readlines()


def copy(src, dst):
    try:
        shutil.copytree(src, dst)
    except OSError as e:
        # If the error was caused because the source wasn't a directory
        if e.errno == errno.ENOTDIR:
            shutil.copy(src, dst)
        else:
            print('Directory not copied. Error: %s' % e)

copy(source, destination)

【问题讨论】:

  • 你的函数定义在你的调用之后。先改变它。
  • @BhargavRao 我将函数调用放在定义之后,但就输出而言,它没有任何变化。

标签: python


【解决方案1】:

shutil.copytree(src, dst)一个目录树从src复制到dst。它不会自动遍历文件列表。您可以尝试压缩源列表和目标列表并循环生成列表:

for src, dst in zip(source, destination):
    copy(src, dst)

当您回退到 shutil.copy(src, dst) 时,您也可能会遇到问题 - 如果目标目录尚不存在,这将失败。

【讨论】:

  • 我压缩了源文本文件和目标文本文件,然后运行脚本,使用您建议的编码,一个 dos 提示打开并且许多路径向下滚动,最后我收到一条错误消息,但它是太快了,我看不懂它是什么。有什么方法可以捕捉到这个错误?
  • 直接从命令窗口运行您的脚本 - 运行 cmd.exe 打开一个 - 这样命令窗口在脚本末尾保持打开状态,您可以向上滚动查看错误消息。此外,您可以将对 copy() 的调用包装在一个裸 try/except 块中以捕获所有异常,然后调用 raw_input() 以在结束脚本之前等待用户输入。为了帮助调试,如何减少列表的大小以便只有几个文件?
  • 感谢您的提示,我从命令行运行了脚本,它只将最后一个虚拟文本文件复制到了适当的目的地。并且我收到了前两个错误:未复制目录。错误:[WinError 123] 文件名、目录名或卷标语法不正确:'C:\\Users\\lfhernandez\\Desktop\\Test\\t2.txt\n'
  • 一方面,您需要去掉每个文件名字符串中的尾随换行符 - file.readlines() 将新行留在原处。请改用file.read().splitlines()。可能文件最后一行没有换行符,所以最后一个文件复制成功了。
  • 太棒了。如果它对您有帮助(并且正确),请考虑接受此答案。
猜你喜欢
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多