Я делал это все время:
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
Следующий код обеспечивает переносимую реализацию.
Обратите внимание, что я использую 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")
Дополнительная документация:
"glob" работает невероятно медленно, если файлов много.
glob работает медленно, так как результатов много, потому что он возвращает один огромный список всех результатов в подходе «большого взрыва». Если результатов много, это займет много памяти и займет много времени.
Вместо этого используйте iglob, как было предложено на предыдущем плакате. iglob конструирует и возвращает один объект-итератор, который можно использовать для циклического перебора результатов, никогда не сохраняя их все в памяти одновременно. Гораздо эффективнее, если совпадений много.
В общем, всякий раз, когда вы пишете код типа «for x in [glob.glob ...]», вы должны вместо этого использовать glob.iglob.
Прежде чем продолжить, посмотрите glob и shutil .
Формирование подпроцесса для копирования файла относительно неэффективно. Использование shutil
будет более эффективным.
Пример ниже довольно наивен - он не проверяет, что что-то пойдет не так, и не создает никаких каталогов, но может делать то, что вы хотите :
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 кажется более функциональным, но не таким портативный и более сложный в использовании.
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