फ़ाइल सिस्टम मैनिपुलेशन के लिए Python में pathlib के उपयोग की व्यापक गाइड
os मॉड्यूल की तुलना में Python pathlib के फायदे जानें—पाथ ऑब्जेक्ट्स, पाथ कंपोनेंट्स और फ़ाइल सिस्टम इंटरैक्शन के लिए सामान्य पाथ ऑपरेशंस का अन्वेषण करें।
हाल तक, Python में फ़ाइल सिस्टम में बदलाव करना बदनाम रूप से कठिन था। डेवलपर्स अक्सर गलत फ़ाइल पाथ के कारण जूझते थे, क्योंकि इनपुट के रूप में लंबे स्ट्रिंग्स देनी पड़ती थीं और वे त्रुटियों के प्रति संवेदनशील थीं। साथ ही, अलग-अलग ऑपरेटिंग सिस्टम के बीच असंगतियों के कारण कोड के बार-बार टूटने की शिकायतें आम थीं।
खुशकिस्मती से, Python संस्करण 3.4 में, डेवलपर्स ने स्टैंडर्ड लाइब्रेरी में pathlib मॉड्यूल जोड़ा। pathlib फ़ाइल सिस्टम पाथ को संभालने के लिए लंबे समय से प्रतीक्षित ऑब्जेक्ट-ओरिएंटेड तरीका प्रदान करता है और प्लेटफ़ॉर्म-अagnostic व्यवहार भी सुनिश्चित करता है।
यह व्यापक ट्यूटोरियल आपको pathlib मॉड्यूल की विशेषताएँ सिखाएगा ताकि आप रोज़मर्रा के फ़ाइल सिस्टम इंटरेक्शंस को बेहतर बना सकें। pathlib का उपयोग करके, आपको कुशल वर्कफ़्लो और आसान डेटा पुनर्प्राप्ति का लाभ मिलेगा। वर्षों में pathlib काफी परिपक्व हो चुका है, और हम आपको नवीनतम जानकारी दे रहे हैं ताकि आपको खुद तलाश न करनी पड़े। आइए शुरू करें।
Python os मॉड्यूल बनाम pathlib
Python 3.4 से पहले, फ़ाइल पाथ को संभालने का पारंपरिक तरीका os मॉड्यूल था। एक समय पर os मॉड्यूल काफ़ी प्रभावी था, लेकिन अब उसकी उम्र दिखने लगी है।
हम pathlib का अनोखा महत्व डेटा साइंस के एक आम कार्य से समझ सकते हैं: किसी दिए गए डायरेक्टरी और उसकी सब-डायरेक्टरीज़ के भीतर सभी png फ़ाइलें कैसे खोजें।
अगर हम os मॉड्यूल का उपयोग कर रहे होते, तो कोड कुछ यूँ होता:
import os
dir_path ="/home/user/documents"
files =[
os.path.join(dir_path, f)for f in os.listdir(dir_path)if os.path.isfile(os.path.join(dir_path, f)) and f.endswith(".png")]संचालित द्वारा
यद्यपि यह कोड हमारी png फ़ाइलें ढूंढ देता है, यह os मॉड्यूल की कई बड़ी कमियाँ भी दिखाता है। एक तो कोड लंबा है और लगभग अपठनीय, जबकि ऑपरेशन अपेक्षाकृत सरल है। दूसरा, यह लिस्ट कॉम्प्रिहेंशन के ज्ञान को मानकर चलता है, जिसे स्वाभाविक नहीं माना जाना चाहिए। तीसरा, इसमें स्ट्रिंग ऑपरेशंस शामिल हैं, जो त्रुटि-प्रवण होते हैं। और इन सबके ऊपर, कोड काफ़ी संक्षिप्त भी नहीं है।
इसके बजाय, अगर हम pathlib मॉड्यूल का उपयोग करें, तो कोड कहीं सरल हो जाता है। जैसा कि बताया, pathlib फ़ाइल सिस्टम पाथ को संभालने के लिए ऑब्जेक्ट-ओरिएंटेड अप्रोच देता है। देखें:
from pathlib import Path
# Create a path object
dir_path = Path(dir_path)# Find all text files inside a directory
files =list(dir_path.glob("*.png"))संचालित द्वारा
यह ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग कोड को ऑब्जेक्ट्स और उनकी इंटरैक्शन के इर्द-गिर्द संगठित करती है, जिससे कोड अधिक मॉड्यूलर, पुन: प्रयोज्य और अनुरक्षित बनता है। यदि आप ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग से अपरिचित हैं, तो इसे हमारे Object-Oriented Python Programming कोर्स के साथ सीखना सार्थक रहेगा।
Python में Path ऑब्जेक्ट्स के साथ कार्य करना
pathlib लाइब्रेरी का केंद्र Path ऑब्जेक्ट्स हैं, जो फ़ाइल सिस्टम पाथ को संरचित और प्लेटफ़ॉर्म-स्वतंत्र तरीके से दर्शाते हैं।
इस ट्यूटोरियल में पहले, हमने pathlib मॉड्यूल से Path क्लास को अपने वर्तमान नेमस्पेस में इस लाइन से लाया था:
pathlib से Path क्लास इम्पोर्ट करने के बाद, हम कई तरीकों से Path ऑब्जेक्ट बना सकते हैं: स्ट्रिंग्स से, अन्य Path ऑब्जेक्ट्स से, करंट वर्किंग डायरेक्टरी से, और होम डायरेक्टरी से।
आइए एक-एक करके देखें।
स्ट्रिंग्स से पाथ ऑब्जेक्ट बनाना
हम किसी फ़ाइल सिस्टम पाथ का प्रतिनिधित्व करने वाली स्ट्रिंग को एक वेरिएबल में पास करके Path ऑब्जेक्ट बना सकते हैं। इससे स्ट्रिंग रूप में दिया गया फ़ाइल पाथ Path ऑब्जेक्ट में बदल जाता है।
file_path_str ="data/union_data.csv"
data_path = Path(file_path_str)संचालित द्वारा
अन्य पाथ ऑब्जेक्ट्स से पाथ ऑब्जेक्ट बनाना
मौजूदा Path ऑब्जेक्ट नए पाथ बनाने के लिए बिल्डिंग ब्लॉक्स का काम कर सकते हैं।
हम बेस पाथ, किसी डेटा डायरेक्टरी और फ़ाइल नाम को जोड़कर एक एकल फ़ाइल पाथ बनाते हैं। हमें याद रखना होगा कि जहाँ उपयुक्त हो, वहाँ अपने Path ऑब्जेक्ट्स को बढ़ाने के लिए फ़ॉरवर्ड स्लैश का उपयोग करें।
यहाँ हम Path.cwd() मेथड का उपयोग करके करंट वर्किंग डायरेक्टरी को cwd वेरिएबल में असाइन करते हैं। इससे हम उस डायरेक्टरी का पाथ प्राप्त कर सकते हैं जहाँ हमारा स्क्रिप्ट चल रहा है।
'/home/bexgboost/articles/2024/4_april/8_pathlib'संचालित द्वारा
होम वर्किंग डायरेक्टरी से पाथ ऑब्जेक्ट बनाना
हम अपनी होम डायरेक्टरी को अतिरिक्त सबडायरेक्टरीज़ के साथ जोड़कर एक पाथ बना सकते हैं। यहाँ हम अपनी होम डायरेक्टरी को "downloads" और "projects" सबडायरेक्टरीज़ के साथ जोड़ रहे हैं।
home = Path.home()
home /"downloads"/"projects"संचालित द्वारा
PosixPath('/home/bexgboost/downloads/projects')संचालित द्वारा
एक महत्वपूर्ण नोट:Path क्लास स्वयं पाथ वैलिडेशन, डायरेक्टरीज़ या फ़ाइलें बनाना जैसे कोई फ़ाइल सिस्टम ऑपरेशन नहीं करता। इसका उद्देश्य पाथ को दर्शाना और उनमें हेरफेर करना है। फ़ाइल सिस्टम से वास्तविक इंटरैक्शन (अस्तित्व जाँचना, पढ़ना/लिखना) के लिए हमें Path ऑब्जेक्ट्स के विशेष मेथड्स का उपयोग करना होगा और कुछ उन्नत मामलों में os मॉड्यूल की मदद लेनी होगी।
Python में Path कंपोनेंट्स के साथ कार्य करना
फ़ाइल पाथ एट्रिब्यूट्स, फ़ाइल सिस्टम में फ़ाइलों और डायरेक्टरीज़ की पहचान और प्रबंधन में सहायक विभिन्न गुण और घटक होते हैं। जैसे किसी भौतिक पते में सड़क संख्या, शहर, देश और पिन कोड जैसे हिस्से होते हैं, वैसे ही फ़ाइल सिस्टम पाथ को भी छोटे-छोटे घटकों में तोड़ा जा सकता है। pathlib हमें इन कंपोनेंट्स तक पहुँचने और उन्हें डॉट नोटेशन के ज़रिये पाथ एट्रिब्यूट्स से नियंत्रित करने देता है।
रूट डायरेक्टरी के साथ कार्य करना
रूट फ़ाइल सिस्टम की सबसे ऊपरी डायरेक्टरी होती है। Unix जैसी प्रणालियों में इसे फ़ॉरवर्ड स्लैश (/) से दिखाया जाता है। Windows में यह आमतौर पर ड्राइव लेटर और कॉलन जैसे C: से दर्शाया जाता है।
image_file = home /"downloads"/"midjourney.png"
image_file.rootसंचालित द्वारा
[PosixPath('/home/bexgboost/downloads'),
PosixPath('/home/bexgboost'),
PosixPath('/home'),
PosixPath('/')]संचालित द्वारा
pathlib का उपयोग कर सामान्य पाथ ऑपरेशंस
Path ऑब्जेक्ट्स में कई मेथड्स होते हैं जो आपको डायरेक्टरीज़ और उनकी सामग्रियों के साथ कुशलतापूर्वक इंटरैक्ट करने देते हैं। आइए कुछ सबसे सामान्य ऑपरेशंस देखें।
डायरेक्टरीज़ लिस्ट करना
iterdir() मेथड आपको किसी फ़ोल्डर के सभी फ़ाइलों और सबडायरेक्टरीज़ पर इटररेट करने देता है। यह किसी डायरेक्टरी की सभी फ़ाइलों को प्रोसेस करने या हर एंट्री पर कोई ऑपरेशन करने में विशेष रूप से उपयोगी है।
क्योंकि Path ऑब्जेक्ट्स केवल पाथ का प्रतिनिधित्व करते हैं, कभी-कभी आपको .exists() मेथड से जाँचना होता है कि पाथ मौजूद है या नहीं:
.exists() मेथड यह जाँचता है कि कोई पाथ मौजूद है या नहीं। यह उपयोगी है क्योंकि Path ऑब्जेक्ट्स ऐसी फ़ाइलों और डायरेक्टरीज़ का प्रतिनिधित्व कर सकते हैं जो फ़ाइल सिस्टम में वास्तव में मौजूद हों भी और न भी हों।
pathlib फ़ाइलें और डायरेक्टरीज़ बनाने और हटाने की क्षमताएँ भी देता है। देखें कैसे।
mkdir() मेथड
mkdir() मेथड निर्दिष्ट पाथ पर नई डायरेक्टरी बनाता है। डिफ़ॉल्ट रूप से यह करंट वर्किंग डायरेक्टरी में डायरेक्टरी बनाता है।
from pathlib import Path
data_dir = Path("new_data_dir")# Create the directory 'new_data_dir' in the current working directory
data_dir.mkdir()संचालित द्वारा
mkdir(parents=True) मेथड
mkdir(parents=True) तब विशेष रूप से उपयोगी है जब आप ऐसा डायरेक्टरी स्ट्रक्चर बनाना चाहें जहाँ कुछ पेरेंट डायरेक्टरीज़ मौजूद न हों। parents=True सेट करने से आवश्यक सभी पेरेंट डायरेक्टरीज़ भी बन जाती हैं।
sub_dir = Path("data/nested/subdirectory")# Create 'data/nested/subdirectory', even if 'data' or 'nested' don't exist
sub_dir.mkdir(parents=True)संचालित द्वारा
ध्यान रखें कि अगर उसी नाम की डायरेक्टरी पहले से मौजूद है तो mkdir() एक exception उठाता है।
FileExistsError: [Errno 17] File exists: 'data'संचालित द्वारा
unlink() मेथड
unlink() मेथड Path ऑब्जेक्ट द्वारा दर्शाई गई फ़ाइल को स्थायी रूप से हटाता है। त्रुटि से बचने के लिए यह मेथड चलाने से पहले फ़ाइल के अस्तित्व की जाँच करना सुझाया जाता है।
to_delete = Path("data/prices.csv")if to_delete.exists():
to_delete.unlink()print(f"Successfully deleted {to_delete.name}")संचालित द्वारा
rmdir() मेथड खाली डायरेक्टरी हटाता है। याद रखें, rmdir() केवल खाली डायरेक्टरी हटाने के लिए काम करता है। किसी नॉन-एम्प्टी डायरेक्टरी को हटाने का सबसे आसान तरीका shutil लाइब्रेरी या टर्मिनल का उपयोग करना है।
empty_dir = Path("new_data_dir")
empty_dir.rmdir()संचालित द्वारा
नोट: कृपया unlink() या rmdir() का उपयोग करते समय सतर्क रहें, क्योंकि इनके परिणाम स्थायी होते हैं।
एडवांस्ड पाथ मैनिपुलेशन
आइए अब कुछ उन्नत पाथ मैनिपुलेशन कॉन्सेप्ट्स और उन्हें pathlib के साथ व्यवहार में कैसे लागू करें, यह देखें।
रिलेटिव बनाम एब्सोल्यूट पाथ
हम अक्सर आने वाले एक विषय से शुरू करेंगे: एब्सोल्यूट और रिलेटिव पाथ में अंतर समझना।
रिलेटिव पाथ
रिलेटिव पाथ किसी फ़ाइल या डायरेक्टरी का स्थान करंट डायरेक्टरी के सापेक्ष बताते हैं, hence relative। ये आपके प्रोजेक्ट के भीतर छोटे और लचीले होते हैं, लेकिन अगर आप वर्किंग डायरेक्टरी बदलते हैं तो भ्रमित कर सकते हैं।
उदाहरण के लिए, मेरी करंट वर्किंग डायरेक्टरी में एक images फ़ोल्डर है, जिसमें midjourney.png फ़ाइल है।
image = Path("images/midjourney.png")
imageसंचालित द्वारा
ऊपर दिया कोड अभी काम करता है, लेकिन अगर मैं अपना नोटबुक किसी और स्थान पर ले जाऊँ, तो स्निपेट टूट जाएगा क्योंकि images फ़ोल्डर नोटबुक के साथ नहीं गया।
एब्सोल्यूट पाथ
एब्सोल्यूट पाथ फ़ाइल सिस्टम की रूट से किसी फ़ाइल या डायरेक्टरी का पूरा स्थान बताते हैं। ये करंट डायरेक्टरी से स्वतंत्र होते हैं और सिस्टम पर कहीं भी किसी भी उपयोगकर्ता के लिए स्पष्ट संदर्भ बिंदु देते हैं।
image_absolute = Path("/home/bexgboost/articles/2024/4_april/8_pathlib/images/midjourney.png")
image_absoluteसंचालित द्वारा
PosixPath('/home/bexgboost/articles/2024/4_april/8_pathlib/images/midjourney.png')संचालित द्वारा
जैसा कि आप देख सकते हैं, एब्सोल्यूट पाथ काफ़ी लंबे हो सकते हैं, खासकर नेस्टेड ट्री स्ट्रक्चर वाले जटिल प्रोजेक्ट्स में। इसी कारण, ज़्यादातर लोग छोटे होने के कारण रिलेटिव पाथ पसंद करते हैं।
resolve मेथड
pathlib में resolve() मेथड है जो रिलेटिव पाथ को एब्सोल्यूट में बदल देता है।
relative_image = Path("images/midjourney.png")
absolute_image = relative_image.resolve()
absolute_imageसंचालित द्वारा
PosixPath('/home/bexgboost/articles/2024/4_april/8_pathlib/images/midjourney.png')संचालित द्वारा
हम उल्टा भी कर सकते हैं: अगर हमारे पास एब्सोल्यूट पाथ है, तो किसी रेफ़रेंस डायरेक्टरी के आधार पर उसे रिलेटिव पाथ में बदल सकते हैं।
relative_path = Path.cwd()
absolute_image.relative_to(relative_path)संचालित द्वारा
pathlib किसी भी डायरेक्टरी में किसी पैटर्न से मिलती फ़ाइलों को कुशलतापूर्वक खोजने के लिए अंतर्निहित .glob() मॉड्यूल का उपयोग करता है। समान नाम या एक्सटेंशन वाली फ़ाइलों को प्रोसेस करते समय यह मॉड्यूल बहुत उपयोगी होता है।
glob मेथड वाइल्डकार्ड्स वाली एक पैटर्न स्ट्रिंग लेकर काम करता है और ऑन-डिमांड मिलते-जुलते Path ऑब्जेक्ट्स प्रदान करने वाला जनरेटर लौटाता है:
*: शून्य या अधिक वर्णों से मेल खाता है।
?: किसी एकल वर्ण से मेल खाता है।
[]: कोष्टकों में दिए वर्ण-रेंज से मेल खाता है (जैसे [a-z] किसी भी लोअरकेस अक्षर से मेल खाता है)।
उदाहरण के तौर पर, आइए मेरी articles डायरेक्टरी में सभी Jupyter नोटबुक्स खोजने की कोशिश करें।
articles_dir = Path.home()/"articles"# Find all scripts
notebooks = articles_dir.glob("*.ipynb")# Print how many foundprint(len(list(notebooks)))संचालित द्वारा
.glob() मेथड ने कोई नोटबुक नहीं पाई, जो पहली नज़र में चौंकाता है क्योंकि मैंने 150 से अधिक लेख लिखे हैं। कारण यह है कि .glob() सिर्फ दी गई डायरेक्टरी के अंदर खोजता है, उसकी सबडायरेक्टरीज़ में नहीं।
हम इसे रिकर्सिव सर्च से सुलझा सकते हैं, जिसके लिए हमें rglob() मेथड का उपयोग करना होगा, जिसकी सिंटैक्स मिलती-जुलती है:
notebooks = articles_dir.rglob("*.ipynb")print(len(list(notebooks)))संचालित द्वारा
जैसा कि हमने देखा, Path ऑब्जेक्ट्स फ़ाइलों का केवल प्रतिनिधित्व करते हैं, उन पर ऑपरेशन नहीं करते। फिर भी, इनमें सामान्य फ़ाइल ऑपरेशंस के लिए कुछ मेथड्स होते हैं। इस खंड में हम उनका उपयोग देखेंगे।
फ़ाइलें पढ़ना
फ़ाइल सामग्री पढ़ना कई Python अनुप्रयोगों में बुनियादी ऑपरेशन है। pathlib फ़ाइलों को टेक्स्ट या रॉ बाइट्स के रूप में पढ़ने के लिए सुविधाजनक शॉर्टहैंड मेथड्स देता है।
read_text() मेथड हमें किसी टेक्स्ट फ़ाइल की सामग्री पढ़ने और फ़ाइल बंद करने की सुविधा देता है।
file= Path("file.txt")print(file.read_text())संचालित द्वारा
जैसा कि हम देखते हैं, write_text() टेक्स्ट को ओवरराइट करता है। यद्यपि write_text() के लिए append मोड नहीं है, हम read_text() और write_text() को साथ में उपयोग करके फ़ाइल के अंत में टेक्स्ट जोड़ सकते हैं।
old_text =file.read_text()+"\n"
final_text ="This is the final text."# Combine old and new texts and write them backfile.write_text(old_text + final_text)print(file.read_text())संचालित द्वारा
rename() एक टारगेट पाथ लेता है, जो स्ट्रिंग या कोई अन्य पाथ ऑब्जेक्ट हो सकता है।
फ़ाइलों को स्थानांतरित करने के लिए आप replace() फ़ंक्शन का उपयोग कर सकते हैं, जो डेस्टिनेशन पाथ भी लेता है:
# Define the file to be moved
source_file = Path("new_file.txt")# Define the location to put the file
destination = Path("data/new/location")# Create the directories if they don't exist
destination.mkdir(parents=True)# Move the file
source_file.replace(destination / source_file.name)संचालित द्वारा
PosixPath('data/new/location/new_file.txt')संचालित द्वारा
खाली फ़ाइलें बनाना
pathlib हमें touch मेथड का उपयोग करके खाली फ़ाइलें बनाने देता है:
# Define new file path
new_dataset = Path("data/new.csv")
new_dataset.exists()संचालित द्वारा
जब आपको भविष्य में उपयोग के लिए फ़ाइलनाम सुरक्षित रखना हो लेकिन इस समय उसमें लिखने के लिए कोई सामग्री न हो, तो आप खाली फ़ाइल बनाने के लिए touch का उपयोग कर सकते हैं। यह मेथड Unix के touch कमांड से प्रेरित है।
परमिशन और फ़ाइल सिस्टम जानकारी
अंत में, हम .stat() मेथड का उपयोग करके फ़ाइल के गुण कैसे प्राप्त करें, यह सीखेंगे। यदि आप os से परिचित हैं, तो आप देखेंगे कि इस नए मेथड का आउटपुट os.stat() जैसा ही है।
image_stats = original_image.stat()
image_statsसंचालित द्वारा
Python 3.4 में pathlib मॉड्यूल के आने से डेवलपर्स के लिए फ़ाइल सिस्टम में बदलाव करना काफी सरल हो गया है। फ़ाइल पाथ को संभालने के लिए ऑब्जेक्ट-ओरिएंटेड अप्रोच देकर, pathlib फ़ाइल सिस्टम पाथ का संरचित और सीधा प्रतिनिधित्व प्रदान करता है। pathlib प्लेटफ़ॉर्म-स्वतंत्रता भी देता है, यानी अलग-अलग ऑपरेटिंग सिस्टम पर पाथ सेपरेटर्स को लगातार संभालता है ताकि हमारा कोड नई मशीन पर टूटे नहीं। अंततः, जैसा कि हमने देखा, pathlib सामान्य फ़ाइल सिस्टम ऑपरेशंस के लिए संक्षिप्त और अभिव्यंजक मेथड्स का व्यापक सेट देता है।
मैं 2 से अधिक वर्षों के अनुभव वाला डेटा साइंस कंटेंट क्रिएटर हूँ और Medium पर सबसे बड़े फॉलोइंग्स में से एक रखता हूँ। मुझे एआई और एमएल पर विस्तार से लेख लिखना पसंद है, जिसमें हल्का-सा व्यंग्यात्मक अंदाज रहता है—क्योंकि कुछ तो करना पड़ता है ताकि वे कम उबाऊ लगें। मैंने 130 से अधिक लेख और एक DataCamp कोर्स तैयार किया है, और एक और बन रहा है। मेरा कंटेंट 50 लाख से अधिक लोगों ने देखा है, जिनमें से 20 हज़ार लोग Medium और LinkedIn पर फॉलोअर्स बन गए।
अपने प्रोग्रामिंग कौशल को बेहतर बनाएं। कोड को अनुकूलित करना, फ़ंक्शन और परीक्षण लिखना, और सर्वोत्तम-अभ्यास सॉफ़्टवेयर इंजीनियरिंग तकनीकों का उपयोग करना सीखें।
हाल तक, Python में फ़ाइल सिस्टम में बदलाव करना बदनाम रूप से कठिन था। डेवलपर्स अक्सर गलत फ़ाइल पाथ के कारण जूझते थे, क्योंकि इनपुट के रूप में लंबे स्ट्रिंग्स देनी पड़ती थीं और वे त्रुटियों के प्रति संवेदनशील थीं। साथ ही, अलग-अलग ऑपरेटिंग सिस्टम के बीच असंगतियों के कारण कोड के बार-बार टूटने की शिकायतें आम थीं।
खुशकिस्मती से, Python संस्करण 3.4 में, डेवलपर्स ने स्टैंडर्ड लाइब्रेरी में
pathlibमॉड्यूल जोड़ा।pathlibफ़ाइल सिस्टम पाथ को संभालने के लिए लंबे समय से प्रतीक्षित ऑब्जेक्ट-ओरिएंटेड तरीका प्रदान करता है और प्लेटफ़ॉर्म-अagnostic व्यवहार भी सुनिश्चित करता है।यह व्यापक ट्यूटोरियल आपको
pathlibमॉड्यूल की विशेषताएँ सिखाएगा ताकि आप रोज़मर्रा के फ़ाइल सिस्टम इंटरेक्शंस को बेहतर बना सकें।pathlibका उपयोग करके, आपको कुशल वर्कफ़्लो और आसान डेटा पुनर्प्राप्ति का लाभ मिलेगा। वर्षों मेंpathlibकाफी परिपक्व हो चुका है, और हम आपको नवीनतम जानकारी दे रहे हैं ताकि आपको खुद तलाश न करनी पड़े। आइए शुरू करें।Python os मॉड्यूल बनाम pathlib
Python 3.4 से पहले, फ़ाइल पाथ को संभालने का पारंपरिक तरीका
osमॉड्यूल था। एक समय परosमॉड्यूल काफ़ी प्रभावी था, लेकिन अब उसकी उम्र दिखने लगी है।हम
pathlibका अनोखा महत्व डेटा साइंस के एक आम कार्य से समझ सकते हैं: किसी दिए गए डायरेक्टरी और उसकी सब-डायरेक्टरीज़ के भीतर सभीpngफ़ाइलें कैसे खोजें।अगर हम
osमॉड्यूल का उपयोग कर रहे होते, तो कोड कुछ यूँ होता:यद्यपि यह कोड हमारी
pngफ़ाइलें ढूंढ देता है, यहosमॉड्यूल की कई बड़ी कमियाँ भी दिखाता है। एक तो कोड लंबा है और लगभग अपठनीय, जबकि ऑपरेशन अपेक्षाकृत सरल है। दूसरा, यह लिस्ट कॉम्प्रिहेंशन के ज्ञान को मानकर चलता है, जिसे स्वाभाविक नहीं माना जाना चाहिए। तीसरा, इसमें स्ट्रिंग ऑपरेशंस शामिल हैं, जो त्रुटि-प्रवण होते हैं। और इन सबके ऊपर, कोड काफ़ी संक्षिप्त भी नहीं है।इसके बजाय, अगर हम pathlib मॉड्यूल का उपयोग करें, तो कोड कहीं सरल हो जाता है। जैसा कि बताया,
pathlibफ़ाइल सिस्टम पाथ को संभालने के लिए ऑब्जेक्ट-ओरिएंटेड अप्रोच देता है। देखें:यह ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग कोड को ऑब्जेक्ट्स और उनकी इंटरैक्शन के इर्द-गिर्द संगठित करती है, जिससे कोड अधिक मॉड्यूलर, पुन: प्रयोज्य और अनुरक्षित बनता है। यदि आप ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग से अपरिचित हैं, तो इसे हमारे Object-Oriented Python Programming कोर्स के साथ सीखना सार्थक रहेगा।
Python में Path ऑब्जेक्ट्स के साथ कार्य करना
pathlibलाइब्रेरी का केंद्रPathऑब्जेक्ट्स हैं, जो फ़ाइल सिस्टम पाथ को संरचित और प्लेटफ़ॉर्म-स्वतंत्र तरीके से दर्शाते हैं।इस ट्यूटोरियल में पहले, हमने
pathlibमॉड्यूल सेPathक्लास को अपने वर्तमान नेमस्पेस में इस लाइन से लाया था:pathlibसेPathक्लास इम्पोर्ट करने के बाद, हम कई तरीकों सेPathऑब्जेक्ट बना सकते हैं: स्ट्रिंग्स से, अन्यPathऑब्जेक्ट्स से, करंट वर्किंग डायरेक्टरी से, और होम डायरेक्टरी से।आइए एक-एक करके देखें।
स्ट्रिंग्स से पाथ ऑब्जेक्ट बनाना
हम किसी फ़ाइल सिस्टम पाथ का प्रतिनिधित्व करने वाली स्ट्रिंग को एक वेरिएबल में पास करके
Pathऑब्जेक्ट बना सकते हैं। इससे स्ट्रिंग रूप में दिया गया फ़ाइल पाथPathऑब्जेक्ट में बदल जाता है।अन्य पाथ ऑब्जेक्ट्स से पाथ ऑब्जेक्ट बनाना
मौजूदा
Pathऑब्जेक्ट नए पाथ बनाने के लिए बिल्डिंग ब्लॉक्स का काम कर सकते हैं।हम बेस पाथ, किसी डेटा डायरेक्टरी और फ़ाइल नाम को जोड़कर एक एकल फ़ाइल पाथ बनाते हैं। हमें याद रखना होगा कि जहाँ उपयुक्त हो, वहाँ अपने
Pathऑब्जेक्ट्स को बढ़ाने के लिए फ़ॉरवर्ड स्लैश का उपयोग करें।करंट वर्किंग डायरेक्टरी से पाथ ऑब्जेक्ट बनाना
यहाँ हम
Path.cwd()मेथड का उपयोग करके करंट वर्किंग डायरेक्टरी कोcwdवेरिएबल में असाइन करते हैं। इससे हम उस डायरेक्टरी का पाथ प्राप्त कर सकते हैं जहाँ हमारा स्क्रिप्ट चल रहा है।होम वर्किंग डायरेक्टरी से पाथ ऑब्जेक्ट बनाना
हम अपनी होम डायरेक्टरी को अतिरिक्त सबडायरेक्टरीज़ के साथ जोड़कर एक पाथ बना सकते हैं। यहाँ हम अपनी होम डायरेक्टरी को "downloads" और "projects" सबडायरेक्टरीज़ के साथ जोड़ रहे हैं।
एक महत्वपूर्ण नोट:
Pathक्लास स्वयं पाथ वैलिडेशन, डायरेक्टरीज़ या फ़ाइलें बनाना जैसे कोई फ़ाइल सिस्टम ऑपरेशन नहीं करता। इसका उद्देश्य पाथ को दर्शाना और उनमें हेरफेर करना है। फ़ाइल सिस्टम से वास्तविक इंटरैक्शन (अस्तित्व जाँचना, पढ़ना/लिखना) के लिए हमेंPathऑब्जेक्ट्स के विशेष मेथड्स का उपयोग करना होगा और कुछ उन्नत मामलों मेंosमॉड्यूल की मदद लेनी होगी।Python में Path कंपोनेंट्स के साथ कार्य करना
फ़ाइल पाथ एट्रिब्यूट्स, फ़ाइल सिस्टम में फ़ाइलों और डायरेक्टरीज़ की पहचान और प्रबंधन में सहायक विभिन्न गुण और घटक होते हैं। जैसे किसी भौतिक पते में सड़क संख्या, शहर, देश और पिन कोड जैसे हिस्से होते हैं, वैसे ही फ़ाइल सिस्टम पाथ को भी छोटे-छोटे घटकों में तोड़ा जा सकता है।
pathlibहमें इन कंपोनेंट्स तक पहुँचने और उन्हें डॉट नोटेशन के ज़रिये पाथ एट्रिब्यूट्स से नियंत्रित करने देता है।रूट डायरेक्टरी के साथ कार्य करना
रूट फ़ाइल सिस्टम की सबसे ऊपरी डायरेक्टरी होती है। Unix जैसी प्रणालियों में इसे फ़ॉरवर्ड स्लैश (
/) से दिखाया जाता है। Windows में यह आमतौर पर ड्राइव लेटर और कॉलन जैसेC:से दर्शाया जाता है।पेरेंट डायरेक्टरी के साथ कार्य करना
पेरेंट वह डायरेक्टरी होती है जिसमें वर्तमान फ़ाइल या डायरेक्टरी शामिल होती है। यह वर्तमान डायरेक्टरी या फ़ाइल से एक स्तर ऊपर होती है।
फ़ाइल नाम के साथ कार्य करना
यह एट्रिब्यूट एक्सटेंशन सहित पूरा फ़ाइल नाम स्ट्रिंग के रूप में लौटाता है।
फ़ाइल के suffix के साथ कार्य करना
suffix एट्रिब्यूट डॉट सहित फ़ाइल एक्सटेंशन स्ट्रिंग के रूप में लौटाता है (या अगर कोई एक्सटेंशन नहीं है तो खाली स्ट्रिंग)।
फ़ाइल के stem के साथ कार्य करना
stem एक्सटेंशन के बिना फ़ाइल नाम लौटाता है। अलग-अलग फ़ॉर्मैट में फ़ाइलें कन्वर्ट करते समय stem के साथ काम करना उपयोगी हो सकता है।
नोट: Mac पर फ़ाइल पाथ केस-सेंसिटिव होते हैं, इसलिए
/Users/username/Documentsऔर/users/username/documentsअलग होंगे।pathlib का parts एट्रिब्यूट
हम
.partsएट्रिब्यूट का उपयोग करके किसीPathऑब्जेक्ट को उसके कंपोनेंट्स में बाँट सकते हैं।pathlib का parents एट्रिब्यूट
parentsएट्रिब्यूट, जो एक जनरेटर लौटाता है, इन कंपोनेंट्स कोPathऑब्जेक्ट्स में बदल देता है।pathlib का उपयोग कर सामान्य पाथ ऑपरेशंस
Pathऑब्जेक्ट्स में कई मेथड्स होते हैं जो आपको डायरेक्टरीज़ और उनकी सामग्रियों के साथ कुशलतापूर्वक इंटरैक्ट करने देते हैं। आइए कुछ सबसे सामान्य ऑपरेशंस देखें।डायरेक्टरीज़ लिस्ट करना
iterdir()मेथड आपको किसी फ़ोल्डर के सभी फ़ाइलों और सबडायरेक्टरीज़ पर इटररेट करने देता है। यह किसी डायरेक्टरी की सभी फ़ाइलों को प्रोसेस करने या हर एंट्री पर कोई ऑपरेशन करने में विशेष रूप से उपयोगी है।क्योंकि
iterdir()एक इटररेटर लौटाता है, एंट्रीज़ लूप के दौरान ज़रूरत पड़ने पर ही प्राप्त की जाती हैं।is_dir() मेथड
is_dir()मेथड अगर पाथ किसी डायरेक्टरी की ओर इंगित करता है तोTrueऔर अन्यथाFalseलौटाता है।is_file() मेथड
.is_file()मेथड अगर पाथ किसी फ़ाइल की ओर इंगित करता है तोTrueऔर अन्यथाFalseलौटाता है।exists() मेथड
क्योंकि
Pathऑब्जेक्ट्स केवल पाथ का प्रतिनिधित्व करते हैं, कभी-कभी आपको.exists()मेथड से जाँचना होता है कि पाथ मौजूद है या नहीं:.exists() मेथड यह जाँचता है कि कोई पाथ मौजूद है या नहीं। यह उपयोगी है क्योंकि
Pathऑब्जेक्ट्स ऐसी फ़ाइलों और डायरेक्टरीज़ का प्रतिनिधित्व कर सकते हैं जो फ़ाइल सिस्टम में वास्तव में मौजूद हों भी और न भी हों।पाथ बनाना और हटाना
pathlibफ़ाइलें और डायरेक्टरीज़ बनाने और हटाने की क्षमताएँ भी देता है। देखें कैसे।mkdir() मेथड
mkdir()मेथड निर्दिष्ट पाथ पर नई डायरेक्टरी बनाता है। डिफ़ॉल्ट रूप से यह करंट वर्किंग डायरेक्टरी में डायरेक्टरी बनाता है।mkdir(parents=True) मेथड
mkdir(parents=True)तब विशेष रूप से उपयोगी है जब आप ऐसा डायरेक्टरी स्ट्रक्चर बनाना चाहें जहाँ कुछ पेरेंट डायरेक्टरीज़ मौजूद न हों।parents=Trueसेट करने से आवश्यक सभी पेरेंट डायरेक्टरीज़ भी बन जाती हैं।ध्यान रखें कि अगर उसी नाम की डायरेक्टरी पहले से मौजूद है तो
mkdir()एक exception उठाता है।unlink() मेथड
unlink()मेथडPathऑब्जेक्ट द्वारा दर्शाई गई फ़ाइल को स्थायी रूप से हटाता है। त्रुटि से बचने के लिए यह मेथड चलाने से पहले फ़ाइल के अस्तित्व की जाँच करना सुझाया जाता है।rmdir() मेथड
rmdir()मेथड खाली डायरेक्टरी हटाता है। याद रखें,rmdir()केवल खाली डायरेक्टरी हटाने के लिए काम करता है। किसी नॉन-एम्प्टी डायरेक्टरी को हटाने का सबसे आसान तरीका shutil लाइब्रेरी या टर्मिनल का उपयोग करना है।नोट: कृपया
unlink()याrmdir()का उपयोग करते समय सतर्क रहें, क्योंकि इनके परिणाम स्थायी होते हैं।एडवांस्ड पाथ मैनिपुलेशन
आइए अब कुछ उन्नत पाथ मैनिपुलेशन कॉन्सेप्ट्स और उन्हें
pathlibके साथ व्यवहार में कैसे लागू करें, यह देखें।रिलेटिव बनाम एब्सोल्यूट पाथ
हम अक्सर आने वाले एक विषय से शुरू करेंगे: एब्सोल्यूट और रिलेटिव पाथ में अंतर समझना।
रिलेटिव पाथ
रिलेटिव पाथ किसी फ़ाइल या डायरेक्टरी का स्थान करंट डायरेक्टरी के सापेक्ष बताते हैं, hence relative। ये आपके प्रोजेक्ट के भीतर छोटे और लचीले होते हैं, लेकिन अगर आप वर्किंग डायरेक्टरी बदलते हैं तो भ्रमित कर सकते हैं।
उदाहरण के लिए, मेरी करंट वर्किंग डायरेक्टरी में एक images फ़ोल्डर है, जिसमें
midjourney.pngफ़ाइल है।ऊपर दिया कोड अभी काम करता है, लेकिन अगर मैं अपना नोटबुक किसी और स्थान पर ले जाऊँ, तो स्निपेट टूट जाएगा क्योंकि images फ़ोल्डर नोटबुक के साथ नहीं गया।
एब्सोल्यूट पाथ
एब्सोल्यूट पाथ फ़ाइल सिस्टम की रूट से किसी फ़ाइल या डायरेक्टरी का पूरा स्थान बताते हैं। ये करंट डायरेक्टरी से स्वतंत्र होते हैं और सिस्टम पर कहीं भी किसी भी उपयोगकर्ता के लिए स्पष्ट संदर्भ बिंदु देते हैं।
जैसा कि आप देख सकते हैं, एब्सोल्यूट पाथ काफ़ी लंबे हो सकते हैं, खासकर नेस्टेड ट्री स्ट्रक्चर वाले जटिल प्रोजेक्ट्स में। इसी कारण, ज़्यादातर लोग छोटे होने के कारण रिलेटिव पाथ पसंद करते हैं।
resolve मेथड
pathlibमेंresolve()मेथड है जो रिलेटिव पाथ को एब्सोल्यूट में बदल देता है।हम उल्टा भी कर सकते हैं: अगर हमारे पास एब्सोल्यूट पाथ है, तो किसी रेफ़रेंस डायरेक्टरी के आधार पर उसे रिलेटिव पाथ में बदल सकते हैं।
Globbing
ग्लॉबिंग को समझाने के लिए, हम लेख की शुरुआत में दिए गए उसी उदाहरण पर लौटते हैं, जहाँ हमने किसी डायरेक्टरी में सभी
pngफ़ाइलें खोजने का कोड लिखा था।pathlibकिसी भी डायरेक्टरी में किसी पैटर्न से मिलती फ़ाइलों को कुशलतापूर्वक खोजने के लिए अंतर्निहित.glob()मॉड्यूल का उपयोग करता है। समान नाम या एक्सटेंशन वाली फ़ाइलों को प्रोसेस करते समय यह मॉड्यूल बहुत उपयोगी होता है।glob मेथड वाइल्डकार्ड्स वाली एक पैटर्न स्ट्रिंग लेकर काम करता है और ऑन-डिमांड मिलते-जुलते
Pathऑब्जेक्ट्स प्रदान करने वाला जनरेटर लौटाता है:*: शून्य या अधिक वर्णों से मेल खाता है।?: किसी एकल वर्ण से मेल खाता है।[]: कोष्टकों में दिए वर्ण-रेंज से मेल खाता है (जैसे [a-z] किसी भी लोअरकेस अक्षर से मेल खाता है)।उदाहरण के तौर पर, आइए मेरी articles डायरेक्टरी में सभी Jupyter नोटबुक्स खोजने की कोशिश करें।
.glob()मेथड ने कोई नोटबुक नहीं पाई, जो पहली नज़र में चौंकाता है क्योंकि मैंने 150 से अधिक लेख लिखे हैं। कारण यह है कि.glob()सिर्फ दी गई डायरेक्टरी के अंदर खोजता है, उसकी सबडायरेक्टरीज़ में नहीं।हम इसे रिकर्सिव सर्च से सुलझा सकते हैं, जिसके लिए हमें
rglob()मेथड का उपयोग करना होगा, जिसकी सिंटैक्स मिलती-जुलती है:इस बार, हमारे कोड ने सभी 357 फ़ाइलें खोज लीं।
फ़ाइलों के साथ कार्य करना
जैसा कि हमने देखा,
Pathऑब्जेक्ट्स फ़ाइलों का केवल प्रतिनिधित्व करते हैं, उन पर ऑपरेशन नहीं करते। फिर भी, इनमें सामान्य फ़ाइल ऑपरेशंस के लिए कुछ मेथड्स होते हैं। इस खंड में हम उनका उपयोग देखेंगे।फ़ाइलें पढ़ना
फ़ाइल सामग्री पढ़ना कई Python अनुप्रयोगों में बुनियादी ऑपरेशन है।
pathlibफ़ाइलों को टेक्स्ट या रॉ बाइट्स के रूप में पढ़ने के लिए सुविधाजनक शॉर्टहैंड मेथड्स देता है।read_text()मेथड हमें किसी टेक्स्ट फ़ाइल की सामग्री पढ़ने और फ़ाइल बंद करने की सुविधा देता है।बाइनरी फ़ाइलों के लिए, हम
read_bytes()मेथड का उपयोग कर सकते हैं।याद रखें, किसी भी
read_*मेथड का उपयोग करते समय एरर हैंडलिंग महत्वपूर्ण है:फ़ाइलें लिखना
फ़ाइलें लिखना, फ़ाइलें पढ़ने जितना ही आसान है। लिखने के लिए हमारे पास
write_text()मेथड है।जैसा कि हम देखते हैं,
write_text()टेक्स्ट को ओवरराइट करता है। यद्यपिwrite_text()के लिए append मोड नहीं है, हमread_text()औरwrite_text()को साथ में उपयोग करके फ़ाइल के अंत में टेक्स्ट जोड़ सकते हैं।write_bytes()भी इसी तरह काम करता है। उदाहरण के लिए, पहलेmidjourney.pngइमेज को नए नाम से डुप्लिकेट करते हैं।with_stem()मेथड अलग फ़ाइलनाम (suffix वही रहता है) के साथ फ़ाइल पाथ लौटाता है। इससे हम किसी मूल इमेज को पढ़कर उसकी सामग्री नई इमेज में लिख सकते हैं।फ़ाइलों का नाम बदलना और स्थानांतरित करना
किसी फ़ाइल के stem का नाम बदलने के लिए
with_stem()के अलावा,pathlibअधिक पूर्ण रूप से नाम बदलने के लिएrename()मेथड देता है।rename()एक टारगेट पाथ लेता है, जो स्ट्रिंग या कोई अन्य पाथ ऑब्जेक्ट हो सकता है।फ़ाइलों को स्थानांतरित करने के लिए आप
replace()फ़ंक्शन का उपयोग कर सकते हैं, जो डेस्टिनेशन पाथ भी लेता है:खाली फ़ाइलें बनाना
pathlibहमेंtouchमेथड का उपयोग करके खाली फ़ाइलें बनाने देता है:touchमेथड मूल रूप से किसी फ़ाइल के मॉडिफिकेशन समय को अपडेट करने के लिए बना था, इसलिए इसे मौजूदा फ़ाइलों पर भी इस्तेमाल किया जा सकता है।जब आपको भविष्य में उपयोग के लिए फ़ाइलनाम सुरक्षित रखना हो लेकिन इस समय उसमें लिखने के लिए कोई सामग्री न हो, तो आप खाली फ़ाइल बनाने के लिए touch का उपयोग कर सकते हैं। यह मेथड Unix के touch कमांड से प्रेरित है।
परमिशन और फ़ाइल सिस्टम जानकारी
अंत में, हम
.stat()मेथड का उपयोग करके फ़ाइल के गुण कैसे प्राप्त करें, यह सीखेंगे। यदि आपosसे परिचित हैं, तो आप देखेंगे कि इस नए मेथड का आउटपुटos.stat()जैसा ही है।हम डॉट नोटेशन का उपयोग करके फ़ाइल साइज़ भी प्राप्त कर सकते हैं।
निष्कर्ष
Python 3.4 में
pathlibमॉड्यूल के आने से डेवलपर्स के लिए फ़ाइल सिस्टम में बदलाव करना काफी सरल हो गया है। फ़ाइल पाथ को संभालने के लिए ऑब्जेक्ट-ओरिएंटेड अप्रोच देकर,pathlibफ़ाइल सिस्टम पाथ का संरचित और सीधा प्रतिनिधित्व प्रदान करता है।pathlibप्लेटफ़ॉर्म-स्वतंत्रता भी देता है, यानी अलग-अलग ऑपरेटिंग सिस्टम पर पाथ सेपरेटर्स को लगातार संभालता है ताकि हमारा कोड नई मशीन पर टूटे नहीं। अंततः, जैसा कि हमने देखा,pathlibसामान्य फ़ाइल सिस्टम ऑपरेशंस के लिए संक्षिप्त और अभिव्यंजक मेथड्स का व्यापक सेट देता है।ध्यान रखें,
pathlibPython की कई शक्तिशाली इनबिल्ट लाइब्रेरीज़ में से एक है। हमारे Data Scientist With Python Career Track, Python Programming Skill Track, और Intro to Python for Data Science कोर्स करके, आप इनबिल्ट लाइब्रेरीज़ के व्यापक सेट में महारत हासिल करेंगे और एक सशक्त Python प्रोग्रामर बनेंगे।पढ़ने के लिए धन्यवाद!