8

私はPythonに比較的慣れていません。構造を維持しながら、ディレクトリを別のディレクトリにコピーしようとしています。

使ってます

    shutil.copytree(src, dst, symlinks=False, ignore=None, 
    copy_function=copy2, ignore_dangling_symlinks=False)

無視するためのコールバック関数を書き込もうとしています。

私の目的は、リスト内のファイルのリストを取得し、残りのファイルを無視して、それらのファイルのみをコピーすることです。リストをコールバック関数に渡すにはどうすればよいですか?

簡単なコールバック関数を作成しましたが、copyTree関数を実行しようとするとエラーが発生します

   def abc(src,names):
    print(src)
    print(names)



    Traceback (most recent call last):
   File "<pyshell#23>", line 1, in <module>
shutil.copytree('D:\Mytest','D:\PythonTestDest3',symlinks=False,ignore=abc)
  File "C:\Python32\lib\shutil.py", line 204, in copytree
if name in ignored_names:
  TypeError: argument of type 'NoneType' is not iterable
4

4 に答える 4

7

無視関数の戻り値は、無視するディレクトリとファイルのリストである必要があります。何も返さないNoneので、エラーが発生しますTypeError: argument of type 'NoneType' is not iterable

'copy_these'にリストされているフォルダー構造とファイルをコピーする例を次に示します。

import os.path

copy_these = ['a.txt', 'b.txt', 'c.txt']

def ignore_most(folder, files):

    ignore_list = []
    for file in files:
       full_path = os.path.join(folder, file)
       if not os.path.isdir(full_path):
           if file not in copy_these:
               ignore_list.append(file)
    return ignore_list
于 2011-08-10T14:54:47.023 に答える
6

シャットダウンモジュールは機能を提供しますignore_patterns

このファクトリ関数は、copytree()のignore引数の呼び出し可能オブジェクトとして使用できる関数を作成し、提供されているglobスタイルのパターンの1つに一致するファイルとディレクトリを無視します。

モジュールページには、いくつかの例も示されています。

于 2011-08-10T14:49:17.750 に答える
0

コールバックの無視関数は、コピーされるべきではない'src'ディレクトリに関連する名前のリストを返す必要があります。

例のコールバックは何も返しません(つまり、なし)。次に、コピーツリーは、リストを期待して、リストを反復処理しようとします。できないので、その例外が発生します。

于 2011-08-10T14:51:35.077 に答える
0

無視する場合は、アクセス先のディレクトリとその内容のリストを引数として受け取る呼び出し可能オブジェクトである必要があります。呼び出し可能オブジェクトは、現在のディレクトリに関連する一連のディレクトリ名とファイル名を返す必要があります。 。; これらの名前は、コピープロセスでは無視されます。

ドキュメント

私の目的は、リスト内のファイルのリストを取得することです

無名関数(lambda)とリスト内包表記を試してください。

copytree(src, dest,
         ignore=lambda d, files: [f for f in files
                                    if f not in files_to_copy
                                    and not is_dir(os.path.join(d, f))])

このlambda関数は、フルパスではなく、ファイルとディレクトリのベース名を取得することに注意してください。ディレクトリ処理のための称賛@jwhitlock。

于 2011-08-10T14:58:39.470 に答える