9

我一直在这样做:

result = subprocess.call(['copy', '123*.xml', 'out_folder\\.', '/y'])
if result == 0: 
    do_something()
else:
    do_something_else()

直到今天我才开始研究pywin32模块,然后看到了win32file.CopyFiles()之类的函数,但后来发现它可能不支持将文件复制到目录。也许这个功能隐藏在某个地方,但我还没有找到它。

我也尝试过“glob”和“shutil”的组合,但是如果有很多文件,“glob”会非常慢。

那么,如何用 Python 模拟这个 Windows 命令呢?

copy 123*.xml out_folder\. /y
4

5 回答 5

10

下面的代码提供了一个可移植的实现。

请注意,我使用的是创建生成器的 iglob(在 Python 2.5 中添加),因此它不会首先将整个文件列表加载到内存中(这就是 glob 所做的)。

from glob import iglob
from shutil import copy
from os.path import join

def copy_files(src_glob, dst_folder):
    for fname in iglob(src_glob):
        copy(fname, join(dst_folder, fname))

if __name__=='__main__':
    copy_files("123*.xml", "out_folder")

附加文件:

于 2010-04-06T11:39:25.317 回答
7

下面的示例相当幼稚 - 不检查是否出现问题,也不创建任何目录,但可能会做你想做的事:

import glob
import shutil

for path in glob.iglob('123*.xml'):
    shutil.copy(path, 'out_folder/%s' % path)

另见:http ://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html

使用 win32file/SHFileOperation 副本似乎更实用,但不那么便携并且使用起来更复杂。

于 2010-04-06T11:47:30.110 回答
3

在继续之前先看看globshutil 。

分叉子进程来复制文件的效率相对较低。使用shutil会更有效率。

于 2010-04-06T11:31:39.703 回答
1

如果文件很多,“glob”会非常慢。

glob 很慢,因为它会以“大爆炸”的方式返回一个包含所有结果的巨大列表,所以结果很多。如果有很多结果,这将使用大量内存并花费很长时间。

正如之前的海报所建议的那样,改用 iglob。iglob 构造并返回一个可用于循环结果的迭代器对象,而无需同时将它们全部放在内存中。如果有很多匹配,效率会更高。

通常,每当您编写诸如“for x in [glob.glob ...]”之类的代码时,您都应该改用 glob.iglob。

于 2010-04-06T11:57:28.083 回答
1
import os
import shutil
path=os.path.join("/home","mypath")
destination=os.path.join("/destination","dir")
for r,d,f in os.walk(path):
     for files in f:
           if files.endswith(".xml"):
                 try:
                     shutil.copy(os.path.join(r,files) , destination)
                 except IOError,e:
                     print e
于 2010-04-06T12:02:49.473 回答