9

私はいつもこれをやっています:

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
4

5 に答える 5

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

追加のドキュメント:

于 2010-04-06T11:39:25.317 に答える
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コピーの使用はより機能的であるように見えますが、移植性が低く、使用がより複雑です。

于 2010-04-06T11:47:30.110 に答える
3

先に進む前に、 globshutilを見てください。

サブプロセスをフォークしてファイルをコピーするのは、比較的非効率的です。使用shutilするとより効率的になります。

于 2010-04-06T11:31:39.703 に答える
1

多くのファイルがある場合、「glob」は非常に遅くなります。

globは、「ビッグバン」アプローチですべての結果の1つの巨大なリストを返すため、多くの結果があります。結果が多い場合、これは多くのメモリを使用し、長い時間がかかります。

以前のポスターで示唆されているように、代わりにiglobを使用してください。iglobは、結果をすべて同時にメモリに格納することなく、結果をループするために使用できる1つのイテレータオブジェクトを作成して返します。一致するものが多い場合は、はるかに効率的です。

一般に、「for x in [glob.glob ...]」のようなコードを作成する場合は、代わりにglob.iglobを使用する必要があります。

于 2010-04-06T11:57:28.083 に答える
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
于 2010-04-06T12:02:49.473 に答える