Copiez des fichiers en utilisant python avec une structure de dossiers complète
Je remplace mon SSD par un meilleur dans quelques jours et j'ai un tas de données stockées dessus que je pourrais regretter si elles sont supprimées. Les seuls types de fichiers dont j'ai besoin sont les fichiers PDF, les fichiers docx, les fichiers txt et d'autres choses. J'ai donc écrit un script pour localiser ces fichiers en utilisant python.
# 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()
Ce script localise simplement le fichier dont les formats correspondent à la liste FileExt et écrit ces emplacements dans le fichier test.txt. Maintenant, je dois transférer ces fichiers tout en conservant la structure exacte des répertoires. Par exemple, s'il existe un fichier comme
C:\Users\<MyUser>\AppData\Local\Files\S0\1\Attachments\hpe[4].docx
Le script doit copier la structure de répertoires entière comme
<BackupDrive>:\<BackupFolderName>\C\Users\<MyUser>\AppData\Local\Files\S0\1\Attachments\hpe[4].docx
Comment copier en utilisant cette structure exacte.
TLDR: Besoin de copier des fichiers tout en conservant la structure des répertoires comme c'est le cas avec Python
PS J'utilise Windows, avec Python 3.8
Réponses
Pour chaque ligne de votre liste de fichiers, procédez comme suit:
for filePath in fileList:
destination = .join(['<BackupDrive>:\<BackupFolderName>', filePath[2:]])
os.makedirs(os.path.dirname(filePath), exist_ok=True)
shutil.copy(filePath , destination)
Puisque vous êtes capable d'écrire des données dans un fichier, je suppose que vous savez également comment lire les données de ce fichier. Ensuite, pour chaque ligne (disons l'appeler source
dans ce fichier, utilisez shutil.copyfile(source, dest)
.
Vous pouvez créer la dest
chaîne en manipulant source
:
# remove 'C:'
str_split = source[2:]
# add backup drive and folder
dest = ''.join(['<BackupDrive>:\<BackupFolderName>', str_split])
Comme mentionné dans les commentaires, le chemin de destination ne sera pas créé automatiquement, mais peut être géré comme expliqué ici: créer le chemin de destination pour les fichiers shutil.copy
Merci à @Emmo et @FloLie pour leurs réponses. Je devais juste utiliser la fonction os.makedirs () avec l'indicateur exist_ok défini sur true pour chaque fichier de la liste.
Il s'agit du code placé immédiatement après le code de la question.
#######################################
# 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)
Cela donne à tout le code l'aspect suivant:
# 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 Cette réponse n'est là que pour les gens comme moi qui n'arrivent pas à comprendre les petits extraits hors contexte parfois 😁