Salin file menggunakan python dengan struktur folder lengkap

Nov 30 2020

Saya mengganti SSD saya dengan yang lebih baik dalam beberapa hari dan saya memiliki banyak data yang tersimpan di dalamnya yang mungkin saya sesali jika dihapus. Satu-satunya jenis file yang saya butuhkan adalah file PDF, file docx, file txt dan hal lainnya. Jadi, saya menulis skrip untuk mencari file-file itu menggunakan 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()

Skrip ini hanya menempatkan file dengan format yang cocok dengan daftar FileExt dan menulis lokasi tersebut ke file test.txt. Sekarang saya perlu mentransfer file-file ini sambil tetap mempertahankan struktur direktori yang tepat. Misalnya, jika ada file sebagai

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

Skrip harus menyalin seluruh struktur direktori sebagai

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

Bagaimana cara menyalin menggunakan struktur yang tepat ini.
TLDR: Perlu menyalin file sambil mempertahankan struktur direktori seperti menggunakan Python
PS Saya menggunakan Windows, dengan Python 3.8

Jawaban

FloLie Nov 29 2020 at 23:20

Untuk setiap baris dalam daftar file Anda, lakukan hal berikut:

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

Karena Anda dapat menulis data ke file, saya berasumsi Anda juga tahu cara membaca data dari file itu. Kemudian untuk setiap baris (sebut saja sourcedi file itu, gunakan shutil.copyfile(source, dest).

Anda dapat membuat deststring dengan memanipulasi source:

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

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

Seperti disebutkan dalam komentar, jalur tujuan tidak akan dibuat secara otomatis, tetapi dapat ditangani seperti yang dijelaskan di sini: buat jalur tujuan untuk file shutil.copy

CrYbAbY Nov 29 2020 at 23:54

Terima kasih kepada @Emmo dan @FloLie atas Jawaban mereka. Saya baru saja menggunakan fungsi os.makedirs () dengan flag existing_ok disetel ke true untuk setiap file dalam daftar.

Ini adalah kode yang ditempatkan tepat setelah kode dalam pertanyaan.

#######################################
# 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)

Ini membuat seluruh kode terlihat seperti:

# 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 Jawaban ini hanya di sini untuk orang-orang seperti saya yang terkadang tidak dapat memahami cuplikan kecil di luar konteks 😁