पूर्ण फ़ोल्डर संरचना के साथ अजगर का उपयोग करके फ़ाइलों की प्रतिलिपि बनाएँ
मैं कुछ दिनों में अपने एसएसडी को बेहतर तरीके से बदल रहा हूं और मेरे पास इस पर संग्रहीत डेटा का एक गुच्छा है जिसे हटाए जाने पर मुझे पछतावा हो सकता है। एकमात्र प्रकार की फाइलें जो मुझे चाहिए वे हैं पीडीएफ फाइलें, डॉकएक्स फाइलें, टीएक्सटी फाइलें और अन्य चीजें। इसलिए, मैंने अजगर का उपयोग करके उन फ़ाइलों का पता लगाने के लिए एक स्क्रिप्ट लिखी।
# 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 का उपयोग कर रहा हूं
जवाब
अपनी फ़ाइल सूची में प्रत्येक पंक्ति के लिए, निम्न कार्य करें:
for filePath in fileList:
destination = .join(['<BackupDrive>:\<BackupFolderName>', filePath[2:]])
os.makedirs(os.path.dirname(filePath), exist_ok=True)
shutil.copy(filePath , destination)
चूंकि आप किसी फ़ाइल में डेटा लिखने में सक्षम हैं, इसलिए मैं मान रहा हूँ कि आप उस फ़ाइल से डेटा पढ़ना भी जानते हैं। फिर प्रत्येक पंक्ति के लिए (कहें 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 फ़ाइलों के लिए गंतव्य पथ बनाएं
उनके उत्तर के लिए @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 संदर्भ से बाहर छोटे स्निपेट का अर्थ नहीं कर सकते