Python 在Windows上使用通配符复制文件

9 投票
5 回答
10748 浏览
提问于 2025-04-15 21:17

我一直在这样做:

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

5 个回答

3

在继续之前,先看看globshutil这两个库。

创建一个子进程来复制文件效率比较低。使用shutil会更有效率。

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来复制文件似乎功能更强大,但不太容易移植,而且使用起来也更复杂。

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")

更多文档资料:

撰写回答