12

私はshutil.copytreeを使用しようとしています:

shutil.copytree(SOURCE_DIR, TARGET_DIR, ignore=None)

このコピーもフォルダー内のファイルです。ファイルなしでフォルダーのみをコピーする必要があります。どうやってするの?

4

6 に答える 6

18

「無視」機能を提供することでそれを行うことができます

def ig_f(dir, files):
    return [f for f in files if os.path.isfile(os.path.join(dir, f))]

shutil.copytree(SRC, DES, ignore=ig_f)

基本的に、copytreeを呼び出すと、各子フォルダーに再帰的に移動し、そのフォルダー内のファイルのリストを無視関数に提供して、それらのファイルがパターンに基づいて適切かどうかを確認します。無視されたファイルは関数の最後にリストとして返され、copytree はそのリストから除外されたアイテムのみをコピーします (この場合、現在のフォルダー内のすべてのファイルが含まれます)。

于 2013-03-27T16:35:55.473 に答える
2

に基づく@ Oz123のソリューションの実装は次のos.walk()とおりです。

import os

def create_empty_dirtree(srcdir, dstdir, onerror=None):
    srcdir = os.path.abspath(srcdir)
    srcdir_prefix = len(srcdir) + len(os.path.sep)
    os.makedirs(dstdir)
    for root, dirs, files in os.walk(srcdir, onerror=onerror):
        for dirname in dirs:
            dirpath = os.path.join(dstdir, root[srcdir_prefix:], dirname)
            try:
                os.mkdir(dirpath)
            except OSError as e:
                if onerror is not None:
                    onerror(e)
于 2013-03-27T17:30:48.637 に答える
1

distutils.dir_util.create_treeディレクトリ構造(ファイルではなく)をコピーするために使用します

注 : 引数filesはファイル名のリストです。shutils.copytree として機能するものが必要な場合:

import os
import distutils.dir_util
def copy_tree(source, dest, **kwargs):
    filenames = [os.path.join(path, file_) for path, _, files in os.walk(source) for file_ in files]
    distutils.dir_util.create_tree(dest, filenames, **kwargs)
于 2013-03-27T16:40:16.050 に答える
1

の使用を検討する必要がありますos.walk

これは os.walk の例です。このようにして、すべてのディレクトリを一覧表示し、os.mkdir.

于 2013-03-27T16:18:00.610 に答える
1

でパターン機能を無視する場合は、次のようにしますos.walk()

ignorePatterns=[".git"]
def create_empty_dirtree(src, dest, onerror=None):
    src = os.path.abspath(src)
    src_prefix = len(src) + len(os.path.sep)
    for root, dirs, files in os.walk(src, onerror=onerror):
        for pattern in ignorePatterns:
            if pattern in root:
                break
        else:
            #If the above break didn't work, this part will be executed
            for dirname in dirs:
                for pattern in ignorePatterns:
                    if pattern in dirname:
                        break
                else:
                    #If the above break didn't work, this part will be executed
                    dirpath = os.path.join(dest, root[src_prefix:], dirname)
                    try:
                        os.makedirs(dirpath,exist_ok=True)
                    except OSError as e:
                        if onerror is not None:
                            onerror(e)
                continue #If the above else didn't executed, this will be reached

        continue #If the above else didn't executed, this will be reached

.gitこれはディレクトリを無視します。

注:古いバージョンでは使用できないオプションPython >=3.2を使用したため、これが必要です。exist_okmakedirs

于 2015-05-11T18:19:59.537 に答える