Windows File Copy Python с подстановочной поддержкой

Я делал это все время:

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

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

Я также попробовал "шарик" и "shutil" комбинацию, но "шарик" является невероятно медленным, если существует много файлов.

Так, как Вы эмулируете эту команду Windows с Python?

copy 123*.xml out_folder\. /y
9
задан SilentGhost 6 April 2010 в 11:32
поделиться

5 ответов

Следующий код обеспечивает переносимую реализацию.

Обратите внимание, что я использую 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")

Дополнительная документация:

10
ответ дан 4 December 2019 в 09:36
поделиться

"glob" работает невероятно медленно, если файлов много.

glob работает медленно, так как результатов много, потому что он возвращает один огромный список всех результатов в подходе «большого взрыва». Если результатов много, это займет много памяти и займет много времени.

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

В общем, всякий раз, когда вы пишете код типа «for x in [glob.glob ...]», вы должны вместо этого использовать glob.iglob.

1
ответ дан 4 December 2019 в 09:36
поделиться

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

Формирование подпроцесса для копирования файла относительно неэффективно. Использование shutil будет более эффективным.

3
ответ дан 4 December 2019 в 09:36
поделиться

Пример ниже довольно наивен - он не проверяет, что что-то пойдет не так, и не создает никаких каталогов, но может делать то, что вы хотите :

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 кажется более функциональным, но не таким портативный и более сложный в использовании.

7
ответ дан 4 December 2019 в 09:36
поделиться
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
1
ответ дан 4 December 2019 в 09:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: