Kopieren Sie mehrere Dateien in Python

Antworten:

138

Sie können os.listdir () verwenden , um die Dateien im Quellverzeichnis abzurufen , os.path.isfile () , um festzustellen , ob es sich um reguläre Dateien handelt (einschließlich symbolischer Links auf * nix-Systemen), und shutil.copy , um das Kopieren durchzuführen .

Der folgende Code kopiert nur die regulären Dateien aus dem Quellverzeichnis in das Zielverzeichnis (ich gehe davon aus, dass Sie keine Unterverzeichnisse kopieren möchten).

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)
GreenMatt
quelle
Sollte dest so etwas wie C: \ myfolder oder C: \ myfolder \ filename.ext sein?
Steve Byrne
4
@StevenByrne Kann entweder sein, je nachdem, ob Sie die Datei auch umbenennen möchten. Wenn nicht, destist der Verzeichnisname. shutil.copy(src, dst)"kopiert die Datei src in die Datei oder das Verzeichnis dst .... Wenn dst ein Verzeichnis angibt, wird die Datei unter Verwendung des Basisdateinamens von src in dst kopiert."
29

Wenn Sie nicht den gesamten Baum (mit Unterverzeichnissen usw.) kopieren möchten, verwenden Sie oder glob.glob("path/to/dir/*.*"), um eine Liste aller Dateinamen abzurufen, durchlaufen Sie die Liste und shutil.copykopieren Sie jede Datei.

for filename in glob.glob(os.path.join(source_dir, '*.*')):
    shutil.copy(filename, dest_dir)
Steven
quelle
2
Hinweis: Möglicherweise müssen Sie die Glob-Ergebnisse mit os.path.isfile () überprüfen, um sicherzustellen, dass es sich um Dateinamen handelt. Siehe auch die Antwort von GreenMatt. Glob gibt zwar nur den Dateinamen wie os.listdir zurück, gibt aber auch weiterhin Verzeichnisnamen zurück. Die ' . 'Muster könnte ausreichen, solange Sie keine erweiterungslosen Dateinamen oder Punkte in Verzeichnisnamen haben.
Steven
Dies kopiert keine Subdirs
Citynorman
12

Schauen Sie sich shutil in den Python-Dokumenten an , insbesondere den Befehl copytree .

Doon
quelle
3
Gute Bemerkung, aber es ist möglicherweise keine Option, wenn das Verzeichnis aus irgendeinem Grund wie in meinem Fall bereits vorhanden ist.
Sven
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
Константин Бушко
quelle
1
Es könnte hilfreich sein, eine verbale Erklärung Ihres Codes zu geben
calico_
1
Ich denke du meinst überschreiben , nicht überschreiben
Mohammad ElNesr
Konstantin tolle Antwort !! Hat mir viel geholfen. Ein Vorschlag: Verwenden Sie os.sep anstelle von '/' (so funktioniert es unter Nicht-Linux-Betriebssystemen)
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)
Isaac Ewhuiknebueze
quelle
2

Hier ist ein weiteres Beispiel für eine rekursive Kopierfunktion, mit der Sie den Inhalt des Verzeichnisses (einschließlich der Unterverzeichnisse) einzeln kopieren können, um dieses Problem zu lösen.

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)

EDIT: Wenn Sie können, auf jeden Fall nur verwenden shutil.copytree(src, dest). Dies setzt jedoch voraus, dass dieser Zielordner noch nicht vorhanden ist. Wenn Sie Dateien in einen vorhandenen Ordner kopieren müssen, funktioniert die oben beschriebene Methode gut!

Dustin Michels
quelle