2010-04-06 4 views
9

Я делал это все время:Python Windows File Copy с поддержкой Wildcard

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

До сегодняшнего дня я начал смотреть в pywin32 модулей, то я видел такие функции, как win32file.CopyFiles(), но затем Я обнаружил, что это может не поддерживать копирование файлов в каталог. Возможно, эта функция где-то скрыта, но я ее еще не нашел.

Я также пробовал комбинацию «glob» и «shutil», но «glob» невероятно медленный, если есть много файлов.

Итак, как вы эмулируете эту команду Windows с помощью Python?

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

+0

Почему. Я изменил пример, чтобы использовать копию вместо файла copy. Это также имеет дополнительное преимущество в том, что биты разрешения также копируются. – Frederik

+2

Просто обратите внимание, что если входные файлы содержат пути, то имя файла назначения должно быть создано с помощью - join (dst_folder, os.path.basename (fname)) – geographika

3

Посмотрите на glob и shutil, прежде чем идти дальше.

Формирование подпроцесса для копирования файла относительно неэффективно. Использование 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 is slow Есть много результатов, потому что он возвращает один огромный список всех результатов в подходе «большой удар». Если есть много результатов, это будет использовать много памяти и займет много времени.

Используйте вместо iglob, как это было предложено предыдущим плакатом. iglob создает и возвращает один объект итератора, который можно использовать для циклического преобразования результатов, без одновременного использования их всех в памяти. Это намного эффективнее, если есть много матчей.

В общем, всякий раз, когда вы пишете код типа «для x в [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 

 Смежные вопросы

  • Нет связанных вопросов^_^