Pythonで複数のファイルをコピーする


回答:


138

os.listdir()を使用してソースディレクトリ内のファイルを取得し、os.path.isfile()を使用してそれらが通常のファイル(* nixシステムのシンボリックリンクを含むかどうかを確認し、shutil.copyを使用してコピーを実行できます。

次のコードでは、通常のファイルのみをソースディレクトリから宛先ディレクトリにコピーします(サブディレクトリをコピーしたくない場合を想定しています)。

import os
import shutil
src_files = os.listdir(src)
for file_name in src_files:
    full_file_name = os.path.join(src, file_name)
    if os.path.isfile(full_file_name):
        shutil.copy(full_file_name, dest)

destはC:\ myfolderまたはC:\ myfolder \ filename.extのようなものにする必要がありますか?
スティーブバーン2018年

4
@StevenByrneファイルの名前も変更するかどうかに応じて、どちらかになります。そうでない場合destは、ディレクトリ名です。shutil.copy(src, dst)"ファイルsrcをファイルまたはディレクトリdstにコピーします。...dstがディレクトリを指定している場合、ファイルはsrcのベースファイル名を使用してdstにコピーされます。"

29

ツリー全体(サブディレクトリなどを含む)をコピーしたくない場合は、またはglob.glob("path/to/dir/*.*")を使用してすべてのファイル名のリストを取得し、リストをループしてshutil.copy各ファイルをコピーします。

for filename in glob.glob(os.path.join(source_dir, '*.*')):
    shutil.copy(filename, dest_dir)

2
注:globの結果をos.path.isfile()でチェックして、ファイル名であることを確認する必要がある場合があります。GreenMattの回答も参照してください。globはos.listdirのようなファイル名のみを返しますが、ディレクトリ名も返します。' 'パターンは、拡張子のないファイル名またはディレクトリ名にドットがない限り、十分かもしれません。
スティーブン

これはサブディレクトリをコピーしません
citynorman


5
def recursive_copy_files(source_path, destination_path, override=False):
    """
    Recursive copies files from source  to destination directory.
    :param source_path: source directory
    :param destination_path: destination directory
    :param override if True all files will be overridden otherwise skip if file exist
    :return: count of copied files
    """
    files_count = 0
    if not os.path.exists(destination_path):
        os.mkdir(destination_path)
    items = glob.glob(source_path + '/*')
    for item in items:
        if os.path.isdir(item):
            path = os.path.join(destination_path, item.split('/')[-1])
            files_count += recursive_copy_files(source_path=item, destination_path=path, override=override)
        else:
            file = os.path.join(destination_path, item.split('/')[-1])
            if not os.path.exists(file) or override:
                shutil.copyfile(item, file)
                files_count += 1
    return files_count

1
コードについて口頭で説明すると役立つ場合があります
calico_

1
上書きではなく上書き
Mohammad ElNesr 2018

コンスタンチンの素晴らしい答え!! たくさん助けてくれました。ただし、1つの提案:「/」の代わりにos.sepを使用する(Linux以外のOSでも機能する)
Ari

4
import os
import shutil
os.chdir('C:\\') #Make sure you add your source and destination path below

dir_src = ("C:\\foooo\\")
dir_dst = ("C:\\toooo\\")

for filename in os.listdir(dir_src):
    if filename.endswith('.txt'):
        shutil.copy( dir_src + filename, dir_dst)
    print(filename)

2

これは、この問題を解決するために使用した、ディレクトリ(サブディレクトリを含む)の内容を一度に1ファイルずつコピーできる再帰コピー機能の別の例です。

import os
import shutil

def recursive_copy(src, dest):
    """
    Copy each file from src dir to dest dir, including sub-directories.
    """
    for item in os.listdir(src):
        file_path = os.path.join(src, item)

        # if item is a file, copy it
        if os.path.isfile(file_path):
            shutil.copy(file_path, dest)

        # else if item is a folder, recurse 
        elif os.path.isdir(file_path):
            new_dest = os.path.join(dest, item)
            os.mkdir(new_dest)
            recursive_copy(file_path, new_dest)

編集:可能であれば、間違いなくを使用してくださいshutil.copytree(src, dest)。ただし、その宛先フォルダーがまだ存在していないことが必要です。既存のフォルダにファイルをコピーする必要がある場合は、上記の方法でうまくいきます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.