Kopieren Sie Dateien mit Python mit vollständiger Ordnerstruktur

Nov 30 2020

Ich tausche meine SSD in ein paar Tagen gegen eine bessere aus und habe eine Reihe von Daten darauf gespeichert, die ich möglicherweise bereue, wenn sie gelöscht werden. Der einzige Dateityp, den ich benötige, sind PDF-Dateien, DocX-Dateien, TXT-Dateien und andere Dinge. Also habe ich ein Skript geschrieben, um diese Dateien mit Python zu finden.

# to copy all of my documents into another location.
import sys
import os
import time
import pathlib
import json


filePath=["D:\\", "C:\\Users"]
# ext=['mkv','docx','doc','pdf','mp4','zip',]
fileExt=["**\*.docx","**\*.doc","**\*.pdf"]
fileList={}
for each_drive in filePath:
    fileList[each_drive]={}
    for each_type in fileExt:
        fileList[each_drive][each_type]=list(pathlib.Path(each_drive).glob(each_type))

file1 = open('test.txt', 'w')
for each in fileList.values():
    for each2 in each.values():
        for entry in each2:
            print(entry)
            file1.writelines(str(str(entry)+ "\n"))


file1.close()

Dieses Skript sucht die Datei nur in Formaten, die mit der FileExt-Liste übereinstimmen, und schreibt diese Speicherorte in die Datei test.txt. Jetzt muss ich diese Dateien übertragen und dabei die genaue Verzeichnisstruktur beibehalten. Zum Beispiel, wenn es eine Datei als gibt

C:\Users\<MyUser>\AppData\Local\Files\S0\1\Attachments\hpe[4].docx

Das Skript sollte die gesamte Verzeichnisstruktur als kopieren

<BackupDrive>:\<BackupFolderName>\C\Users\<MyUser>\AppData\Local\Files\S0\1\Attachments\hpe[4].docx

Wie kopiere ich mit genau dieser Struktur?
TLDR: Sie müssen Dateien kopieren, während die Verzeichnisstruktur wie bei Python
PS beibehalten wird. Ich verwende Windows mit Python 3.8

Antworten

FloLie Nov 29 2020 at 23:20

Gehen Sie für jede Zeile in Ihrer Dateiliste wie folgt vor:

for filePath in fileList:
    destination = .join(['<BackupDrive>:\<BackupFolderName>', filePath[2:]])
    os.makedirs(os.path.dirname(filePath), exist_ok=True)
    shutil.copy(filePath , destination)
emmo Nov 29 2020 at 23:12

Da Sie Daten in eine Datei schreiben können, gehe ich davon aus, dass Sie auch wissen, wie man Daten aus dieser Datei liest. sourceVerwenden Sie dann für jede Zeile (sagen wir, rufen Sie sie in dieser Datei auf) shutil.copyfile(source, dest).

Sie können die destZeichenfolge erstellen, indem Sie Folgendes bearbeiten source:

# remove 'C:'
str_split = source[2:]

# add backup drive and folder
dest = ''.join(['<BackupDrive>:\<BackupFolderName>', str_split])

Wie in den Kommentaren erwähnt, wird der Zielpfad nicht automatisch erstellt, sondern kann wie hier beschrieben behandelt werden: Erstellen Sie den Zielpfad für die Dateien shutil.copy

CrYbAbY Nov 29 2020 at 23:54

Vielen Dank an @Emmo und @FloLie für ihre Antworten. Ich musste nur die Funktion os.makedirs () verwenden, wobei das exist_ok-Flag für jede Datei in der Liste auf true gesetzt war.

Dies ist der Code, der unmittelbar nach dem Code in der Frage platziert wird.

#######################################
# create destination directory
file1=open ('test.txt', 'r')
text= file1.readlines()
# print(text)
for each in text:
    each=each[:-1]
    destination="BackupDIR-"+each[0]+each[2:]
    os.makedirs(os.path.dirname(destination), exist_ok=True)
    shutil.copy(each,destination)

Dadurch sieht der gesamte Code folgendermaßen aus:

# to copy all of my documents into another location.
import os
import time
import pathlib
import json
import shutil


filePath=["D:\\", "C:\\Users"]
# ext=['mkv','docx','doc','pdf','mp4','zip',]
fileExt=["**\*.docx","**\*.doc","**\*.pdf"]
fileList={}
for each_drive in filePath:
    fileList[each_drive]={}
    for each_type in fileExt:
        fileList[each_drive][each_type]=list(pathlib.Path(each_drive).glob(each_type))

file1 = open('test.txt', 'w')
for each in fileList.values():
    for each2 in each.values():
        for entry in each2:
            print(entry)
            file1.writelines(str(str(entry)+ "\n"))
file1.close()

#######################################
# create destination directory
file1=open ('test.txt', 'r')
text= file1.readlines()
# print(text)
for each in text:
    each=each[:-1]
    destination="BackupDIR-"+each[0]+each[2:]
    os.makedirs(os.path.dirname(destination), exist_ok=True)
    shutil.copy(each,destination)

PS Diese Antwort ist nur für Leute wie mich da, die manchmal kleine Schnipsel aus dem Kontext nicht verstehen können 😁