पूर्ण फ़ोल्डर संरचना के साथ अजगर का उपयोग करके फ़ाइलों की प्रतिलिपि बनाएँ

Nov 30 2020

मैं कुछ दिनों में अपने एसएसडी को बेहतर तरीके से बदल रहा हूं और मेरे पास इस पर संग्रहीत डेटा का एक गुच्छा है जिसे हटाए जाने पर मुझे पछतावा हो सकता है। एकमात्र प्रकार की फाइलें जो मुझे चाहिए वे हैं पीडीएफ फाइलें, डॉकएक्स फाइलें, टीएक्सटी फाइलें और अन्य चीजें। इसलिए, मैंने अजगर का उपयोग करके उन फ़ाइलों का पता लगाने के लिए एक स्क्रिप्ट लिखी।

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

यह स्क्रिप्ट फ़ाइल को फ़ाइलटेक्स्ट सूची से मेल खाने वाले प्रारूपों के साथ खोजती है और उन स्थानों को टेस्ट.टेक्स्ट फ़ाइल में लिख देती है। अब मुझे सटीक निर्देशिका संरचना को रखते हुए इन फ़ाइलों को स्थानांतरित करने की आवश्यकता है। उदाहरण के लिए, यदि कोई फ़ाइल है

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

स्क्रिप्ट को पूरी निर्देशिका संरचना की प्रतिलिपि बनाना चाहिए

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

मैं इस सटीक संरचना का उपयोग करके प्रतिलिपि कैसे बना सकता हूं।
TLDR: निर्देशिका संरचना को रखते हुए फ़ाइलों को कॉपी करने की आवश्यकता है, जैसा कि पायथन
PS का उपयोग कर रहा है। मैं Python 3.8 के साथ Windows का उपयोग कर रहा हूं

जवाब

FloLie Nov 29 2020 at 23:20

अपनी फ़ाइल सूची में प्रत्येक पंक्ति के लिए, निम्न कार्य करें:

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

चूंकि आप किसी फ़ाइल में डेटा लिखने में सक्षम हैं, इसलिए मैं मान रहा हूँ कि आप उस फ़ाइल से डेटा पढ़ना भी जानते हैं। फिर प्रत्येक पंक्ति के लिए (कहें sourceकि इसे उस फ़ाइल में कॉल करें , उपयोग करें shutil.copyfile(source, dest)

आप destजोड़ तोड़ करके स्ट्रिंग बना सकते हैं source:

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

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

जैसा कि टिप्पणियों में उल्लेख किया गया है, गंतव्य पथ स्वचालित रूप से नहीं बनाया जाएगा, लेकिन इसे यहां समझाया जा सकता है: shutter.cz फ़ाइलों के लिए गंतव्य पथ बनाएं

CrYbAbY Nov 29 2020 at 23:54

उनके उत्तर के लिए @Emmo और @FloLie को धन्यवाद। मुझे बस सूची में प्रत्येक फ़ाइल के लिए true_ok ध्वज सेट के साथ os.makedirs () फ़ंक्शन का उपयोग करना था।

यह प्रश्न में कोड के तुरंत बाद रखा गया कोड है।

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

यह संपूर्ण कोड जैसा दिखता है:

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

पुनश्च यह उत्तर केवल मेरे जैसे लोगों के लिए है, जो कभी-कभी sometimes संदर्भ से बाहर छोटे स्निपेट का अर्थ नहीं कर सकते