私はshutil.copytreeを使用しようとしています:
shutil.copytree(SOURCE_DIR, TARGET_DIR, ignore=None)
このコピーもフォルダー内のファイルです。ファイルなしでフォルダーのみをコピーする必要があります。どうやってするの?
「無視」機能を提供することでそれを行うことができます
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 はそのリストから除外されたアイテムのみをコピーします (この場合、現在のフォルダー内のすべてのファイルが含まれます)。
に基づく@ 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)
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)
の使用を検討する必要がありますos.walk
。
これは os.walk の例です。このようにして、すべてのディレクトリを一覧表示し、os.mkdir
.
でパターン機能を無視する場合は、次のようにします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_ok
makedirs