2010-04-06 41 views
9

我一直在做這一切的時候:Python的Windows文件複製與支持通配符

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 

回答

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

附加文檔:下面的例子

+0

爲什麼所有這些麻煩與'copyfile'?爲什麼不使用'copy'? – SilentGhost 2010-04-06 11:41:51

+0

爲什麼確實如此。我已經將示例更改爲使用副本而不是複製文件。這也具有額外的優點,即權限位也被複制。 – Frederik 2010-04-06 12:00:56

+2

請注意,如果輸入文件包含路徑,則目標文件名必須使用 - join(dst_folder,os.path.basename(fname)) – geographika 2012-06-08 07:35:20

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拷貝似乎更多的功能,但並不像便攜和更復雜的使用。

1

如果存在多個文件,「glob」會非常慢。

glob慢是因爲它返回一個巨大的列表中的所有結果在一個「大爆炸」方法的巨大列表。如果有很多結果,這會佔用大量內存並需要很長時間。

改爲使用iglob,如先前的海報所示。 iglob構造並返回一個可用於遍歷結果的迭代器對象,而不會將它們全部同時存儲在內存中。如果有很多比賽,效率會更高。

一般來說,無論何時你寫代碼如「for [in glob.glob ...]」,你應該使用glob.iglob代替。

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