Skip to content
This page has been auto-translated and may contain errors.View in English

फ़ाइलें और एक्सेप्शन

अधिकांश प्रोग्राम जो वास्तविक काम करते हैं, फ़ाइल सिस्टम से जुड़ते हैं: कॉन्फ़िग पढ़ना, परिणाम लिखना, डेटा लोड करना। और जब कुछ गलत होता है, तो Python एक एक्सेप्शन उठाता है, एक संकेत कि कुछ अप्रत्याशित हुआ। यह अध्याय दोनों को कवर करता है: फ़ाइलों से डेटा अंदर और बाहर लाना, और ऐसा कोड लिखना जो क्रैश होने के बजाय त्रुटियों को सहजता से संभालता है।

फ़ाइल I/O और एक्सेप्शन हैंडलिंग वे दो तंत्र हैं जो प्रोग्राम को मज़बूत बनाते हैं। open() फ़ाइल सिस्टम तक पहुँच देता है; with यह सुनिश्चित करता है कि त्रुटि होने पर भी सफ़ाई हो। try/except विशिष्ट एक्सेप्शन प्रकारों को पकड़ता है, जिससे आप क्रैश होने के बजाय सहजता से उबर सकते हैं। मिलकर ये किसी भी ऐसी स्क्रिप्ट की नींव बनाते हैं जो बिना निगरानी के चलती है।

Python में फ़ाइल ऑपरेशन OS के फ़ाइल डिस्क्रिप्टर एब्स्ट्रैक्शन से होकर जाते हैं। open() एक फ़ाइल ऑब्जेक्ट लौटाता है जिसका प्रकार मोड और बफरिंग सेटिंग्स पर निर्भर करता है। कॉन्टेक्स्ट मैनेजर __enter__ और __exit__ के माध्यम से संसाधन सफ़ाई की गारंटी देते हैं। एक्सेप्शन हैंडलिंग संरचित अनवाइंडिंग का उपयोग करती है: जब एक एक्सेप्शन प्रसारित होता है, Python कॉल स्टैक पर चलता हुआ मेल खाने वाले except क्लॉज़ की तलाश करता है, और बाहर निकलते समय finally ब्लॉक को अवश्य निष्पादित करता है।

फ़ाइलें खोलना

open() एक फ़ाइल खोलता है और एक ऑब्जेक्ट लौटाता है जिससे आप पढ़ या लिख सकते हैं। आप उसे पथ और फ़ाइल के साथ क्या करना है (पढ़ना, लिखना, या जोड़ना) बताते हैं। जब आपका काम हो जाए, तो फ़ाइल को हमेशा बंद करें; with स्टेटमेंट यह स्वचालित रूप से करता है।

open(path, mode) एक फ़ाइल ऑब्जेक्ट लौटाता है। मोड स्ट्रिंग पहुँच को नियंत्रित करती है: "r" पढ़ने के लिए, "w" लिखने के लिए (पहले ट्रंकेट करता है), "a" जोड़ने के लिए। "b" जोड़ने से बाइनरी मोड मिलता है। टेक्स्ट मोड के लिए डिफ़ॉल्ट एन्कोडिंग सिस्टम लोकेल है; पोर्टेबिलिटी के लिए encoding="utf-8" स्पष्ट रूप से निर्दिष्ट करें।

open() फ़ाइल डिस्क्रिप्टर आवंटित करने के लिए OS को कॉल करता है और एक बफ़र्ड I/O रैपर लौटाता है। टेक्स्ट मोड TextIOWrapper के साथ रैप करता है, जो एन्कोडिंग और यूनिवर्सल न्यूलाइन्स को संभालता है। बाइनरी मोड BufferedReader या BufferedWriter लौटाता है। encoding पैरामीटर पोर्टेबिलिटी के लिए महत्वपूर्ण है: डिफ़ॉल्ट (locale.getpreferredencoding()) प्लेटफ़ॉर्म के अनुसार भिन्न होता है। जब तक कोई विशिष्ट कारण न हो, टेक्स्ट फ़ाइलों के लिए हमेशा encoding="utf-8" निर्दिष्ट करें।

python
f = open("data.txt", "r")    # "r" = पढ़ना
content = f.read()
f.close()

"r" मोड है:

मोडअर्थ
"r"पढ़ना। फ़ाइल का होना ज़रूरी है। डिफ़ॉल्ट मोड।
"w"लिखना। फ़ाइल बनाता है या ओवरराइट करता है।
"a"जोड़ना। मिटाए बिना अंत में जोड़ता है।
"x"बनाना। यदि फ़ाइल पहले से मौजूद हो तो विफल होता है।
"r+"पढ़ना और लिखना।
"b"बाइनरी। किसी भी मोड में जोड़ें: "rb", "wb"

जब आपका काम हो जाए तो हमेशा .close() कॉल करें। इसे भूलने से फ़ाइल लॉक रह जाती है और डेटा भ्रष्टाचार हो सकता है। इसे संभालने का विश्वसनीय तरीका with स्टेटमेंट है।

with स्टेटमेंट

with open(...) आपके लिए फ़ाइल का प्रबंधन करता है, इंडेंटेड ब्लॉक समाप्त होने पर इसे स्वचालित रूप से बंद कर देता है, भले ही कोई त्रुटि हो जाए। मैन्युअल open()/close() के बजाय हमेशा with open(...) का उपयोग करें। यह अधिक सुरक्षित है और मानक है।

with Python की कॉन्टेक्स्ट मैनेजर सिंटैक्स है। यह शुरुआत में __enter__ और अंत में __exit__ कॉल करता है, भले ही कोई एक्सेप्शन उठाया गया हो। फ़ाइलों के लिए, __exit__ फ़ाइल डिस्क्रिप्टर को बंद करता है। यह हर फ़ाइल एक्सेस के चारों ओर try/finally रैपर की आवश्यकता के बिना सफ़ाई की गारंटी देता है।

with expr as name expr.__enter__() कॉल करता है और परिणाम को name से बाइंड करता है। बाहर निकलने पर (सामान्य या एक्सेप्शन), expr.__exit__(exc_type, exc_val, tb) कॉल किया जाता है। यदि __exit__ truthy लौटाता है, तो एक्सेप्शन दबा दिया जाता है। फ़ाइल ऑब्जेक्ट इस प्रोटोकॉल को लागू करते हैं: __exit__ self.close() को कॉल करता है। कॉन्टेक्स्ट मैनेजर को स्टैक किया जा सकता है: with open(a) as f, open(b) as g: कई फ़ाइलों के साथ काम करने के लिए मुहावरेदार है।

python
with open("data.txt", "r") as f:
    content = f.read()

# f यहाँ बंद है, गारंटीशुदा

with क्या करता है?

with Python की कॉन्टेक्स्ट मैनेजर सिंटैक्स है। यह आपके लिए सेटअप और टियरडाउन कोड कॉल करता है; इस मामले में, फ़ाइल को खोलना और विश्वसनीय रूप से बंद करना। आपको यह जानने की ज़रूरत नहीं है कि यह आंतरिक रूप से कैसे काम करता है। बस open() के साथ इसका उपयोग करें।

फ़ाइलें पढ़ना

पढ़ने के लिए तीन विधियाँ। .read() पूरी फ़ाइल को एक स्ट्रिंग के रूप में लोड करता है। .readline() एक लाइन पढ़ता है। फ़ाइल ऑब्जेक्ट पर सीधे इटरेट करना लाइन-दर-लाइन पढ़ता है, जो बड़ी फ़ाइलों के लिए सबसे कुशल तरीका है क्योंकि यह सब कुछ एक साथ मेमोरी में लोड नहीं करता।

.read() पूरी फ़ाइल को मेमोरी में लोड करता है। .readline() न्यूलाइन कैरेक्टर सहित एक लाइन पढ़ता है। .readlines() सभी लाइनों की एक सूची लौटाता है। फ़ाइल ऑब्जेक्ट पर सीधे इटरेट करना बड़ी फ़ाइलों के लिए सबसे मेमोरी-कुशल पैटर्न है: यह बफ़र से एक समय में एक लाइन पढ़ता है बिना पूर्ण सामग्री को रखे।

.read() EOF तक पढ़ता है, सामग्री को एक स्ट्रिंग के रूप में लौटाता है (या बाइनरी मोड में बाइट्स)। .readline() \n या EOF तक पढ़ता है। फ़ाइल ऑब्जेक्ट को इटरेट करना __iter__ कॉल करता है, जो बार-बार readline() कॉल करता है: O(1) मेमोरी, लाइन-दर-लाइन प्रोसेसिंग। .readlines() list(file) के बराबर है लेकिन सभी लाइनों को पहले से मटीरियलाइज़ करता है। बहुत बड़ी फ़ाइलों के लिए, इटरेटर पैटर्न को .read() से अधिक प्राथमिकता दी जाती है।

python
with open("data.txt", "r") as f:
    content = f.read()          # पूरी फ़ाइल एक स्ट्रिंग के रूप में

with open("data.txt", "r") as f:
    first_line = f.readline()   # एक समय में एक लाइन

with open("data.txt", "r") as f:
    lines = f.readlines()       # लाइनों की सूची, प्रत्येक "\n" में समाप्त

बड़ी फ़ाइलों के लिए, लाइन-दर-लाइन पढ़ना सब कुछ एक साथ लोड करने से अधिक कुशल है:

python
with open("big_file.txt", "r") as f:
    for line in f:              # फ़ाइल को सीधे इटरेट करें, मेमोरी-कुशल
        print(line.strip())     # strip() ट्रेलिंग न्यूलाइन को हटाता है

फ़ाइल ऑब्जेक्ट पर सीधे इटरेट करना (for line in f) बड़ी फ़ाइल पढ़ने का सबसे कुशल और मुहावरेदार तरीका है।

फ़ाइलें लिखना

"w" मोड फ़ाइल को पूरी तरह से ओवरराइट करता है यदि वह मौजूद हो। "a" मोड अंत में जोड़ता है। .write() स्वचालित रूप से न्यूलाइन नहीं जोड़ता; प्रत्येक लाइन के अंत में स्पष्ट रूप से "\n" शामिल करें। एक साथ कई लाइनें लिखने के लिए, उन्हें "\n".join() के साथ जोड़ें।

.write(s) एक स्ट्रिंग लिखता है और लिखे गए कैरेक्टरों की संख्या लौटाता है। यह न्यूलाइन नहीं जोड़ता। .writelines(iterable) बिना सेपरेटर जोड़े इटरेबल से प्रत्येक स्ट्रिंग लिखता है। "w" खोलने पर ट्रंकेट करता है; "a" EOF तक सीक करता है। पोर्टेबिलिटी के लिए, प्लेटफ़ॉर्म-विशिष्ट लाइन एंडिंग्स को हार्डकोड करने के बजाय "\n" या os.linesep का उपयोग करें।

.write() बफ़र में लिखता है; जब तक .flush() या .close() कॉल नहीं होता, डेटा डिस्क तक नहीं पहुँच सकता। "w" मोड खोलने पर truncate(0) कॉल करता है, किसी भी पिछली सामग्री को नष्ट कर देता है। "a" मोड प्रत्येक लेखन से पहले EOF तक सीक करता है, इसे समवर्ती जोड़ने वालों के लिए सुरक्षित बनाता है (अधिकांश OS पर)। f.writelines() प्रत्येक आइटम के लिए f.write() कॉल करता है: कोई अतिरिक्त मेमोरी आवंटन नहीं लेकिन कोई सेपरेटर भी नहीं जोड़ा गया।

python
with open("output.txt", "w") as f:
    f.write("Hello, world\n")

with open("output.txt", "a") as f:
    f.write("Another line\n")

"w" फ़ाइल को पूरी तरह से ओवरराइट करता है यदि वह मौजूद हो। "a" अंत में जोड़ता है।

f.write() स्वचालित रूप से न्यूलाइन नहीं जोड़ता, इसलिए स्पष्ट रूप से "\n" शामिल करें। एक साथ कई लाइनें लिखने के लिए:

python
lines = ["Line one", "Line two", "Line three"]

with open("output.txt", "w") as f:
    f.write("\n".join(lines) + "\n")

एक्सेप्शन

जब Python किसी ऐसी समस्या से टकराता है जिसे वह संभाल नहीं सकता, तो यह एक एक्सेप्शन उठाता है: एक त्रुटि जो बताती है कि क्या गलत हुआ और कहाँ। यदि आप इसे संभालते नहीं हैं, तो आपका प्रोग्राम क्रैश हो जाता है और एक ट्रेसबैक प्रिंट करता है। नीचे दी गई तालिका सबसे आम एक्सेप्शन दिखाती है जिनका आप सामना करेंगे।

एक्सेप्शन वे ऑब्जेक्ट हैं जो BaseException से इनहेरिट करते हैं। सभी उपयोगकर्ता-सामना करने वाले एक्सेप्शन Exception से इनहेरिट करते हैं। जब उठाया जाता है, Python मेल खाने वाले except क्लॉज़ की तलाश में कॉल स्टैक को अनवाइंड करता है। ट्रेसबैक एक्सेप्शन के बिंदु से एंट्री पॉइंट तक पूरी कॉल चेन दिखाता है।

एक्सेप्शन ऑब्जेक्ट टाइप, संदेश, और ट्रेसबैक ऑब्जेक्ट की ओर इशारा करने वाला __traceback__ विशेषता रखते हैं। raise एक नया एक्सेप्शन बनाता है; बिना तर्क के raise मूल ट्रेसबैक को संरक्षित करते हुए वर्तमान एक्सेप्शन को फिर से उठाता है। एक्सेप्शन चेनिंग (raise B from A) दो एक्सेप्शन को लिंक करती है और ट्रेसबैक में दिखाई जाती है। BaseException रूट है; KeyboardInterrupt और SystemExit सीधे इससे इनहेरिट करते हैं, Exception से नहीं, यही कारण है कि एक खाली except Exception उन्हें नहीं पकड़ता।

आम एक्सेप्शन जिनका आप सामना करेंगे:

एक्सेप्शनकब होता है
FileNotFoundErroropen() फ़ाइल नहीं ढूँढ़ सकता
ValueErrorफ़ंक्शन को सही प्रकार लेकिन गलत सामग्री का मान मिलता है, जैसे int("abc")
TypeErrorपूरी तरह से गलत प्रकार, जैसे "hello" + 5
KeyErrorडिक्शनरी कुंजी मौजूद नहीं है
IndexErrorसूची इंडेक्स सीमा से बाहर
ZeroDivisionErrorशून्य से विभाजन
AttributeErrorऑब्जेक्ट के पास वह विशेषता या विधि नहीं है

try / except

विफल हो सकने वाले कोड को try ब्लॉक में रैप करें। यदि कोई एक्सेप्शन होता है, तो मेल खाने वाला except ब्लॉक क्रैश होने के बजाय इसे संभालता है। आप किस एक्सेप्शन को पकड़ते हैं, इसके बारे में विशिष्ट रहें: खाली except: के साथ सब कुछ पकड़ना वास्तविक बग्स को छुपाता है।

try/except विशिष्ट एक्सेप्शन प्रकारों को इंटरसेप्ट करता है। असंबंधित त्रुटियों को चुपचाप निगलने से बचने के लिए प्रकार निर्दिष्ट करें। आप संदेश का निरीक्षण करने के लिए as e के साथ एक्सेप्शन को एक नाम से बाइंड कर सकते हैं। एकाधिक except क्लॉज़ विभिन्न एक्सेप्शन प्रकारों को संभालते हैं; Python पहले संगत क्लॉज़ से मेल खाता है।

except ExceptionType as e यदि isinstance(raised_exception, ExceptionType) सत्य है तो मेल खाता है। इसका मतलब है कि Exception को पकड़ना सभी सबक्लास को भी पकड़ता है। Python पहले except क्लॉज़ से मेल खाता है जिसका प्रकार मेल खाता है; बाद के क्लॉज़ छोड़ दिए जाते हैं। except (A, B) as e किसी भी प्रकार को पकड़ता है। एक खाली except: KeyboardInterrupt और SystemExit सहित सब कुछ पकड़ता है, जो लगभग कभी समझ में नहीं आता।

python
try:
    value = int("abc")
except ValueError:
    print("That's not a valid number")

आप किस एक्सेप्शन को पकड़ते हैं, इसके बारे में विशिष्ट रहें। खाली except: के साथ सभी एक्सेप्शन पकड़ना बग्स को छुपाता है:

python
# बुरा, प्रोग्रामर की गलतियों सहित सब कुछ पकड़ता है
try:
    result = do_something()
except:
    pass

# अच्छा, केवल वही पकड़ता है जिसकी आप अपेक्षा करते हैं और वास्तव में संभाल सकते हैं
try:
    result = do_something()
except FileNotFoundError:
    print("File not found")

एकाधिक एक्सेप्शन पकड़ना

आप अलग-अलग except ब्लॉक में विभिन्न त्रुटि प्रकारों को संभाल सकते हैं, या एक ट्यूपल का उपयोग करके एक ब्लॉक में कई प्रकारों को पकड़ सकते हैं। as e हिस्सा आपको त्रुटि संदेश तक पहुँच देता है।

एकाधिक except क्लॉज़ ऊपर से नीचे मूल्यांकित किए जाते हैं; पहला मेल जीतता है। एक ट्यूपल में कई प्रकारों को पकड़ना उनमें से किसी को भी पकड़ता है। as e का उपयोग एक्सेप्शन इंस्टेंस को बाइंड करता है, जो संदेश, प्रकार, और ट्रेसबैक तक पहुँच देता है। सबसे विशिष्ट प्रकार को पहले और अधिक सामान्य प्रकारों को बाद में पकड़ना शैडोइंग से बचाता है।

except (A, B) as e एक एकल क्लॉज़ के लिए सिंटैक्टिक शुगर है जो दोनों को पकड़ता है। as e बाइंडिंग except ब्लॉक से बाहर निकलने के बाद साफ़ हो जाती है (ट्रेसबैक के साथ संदर्भ चक्र को रोकने के लिए)। अतिरिक्त संदर्भ के साथ फिर से उठाने के लिए, raise ValueError("context") from e का उपयोग करें, जो __cause__ सेट करता है और ट्रेसबैक में दोनों एक्सेप्शन दिखाता है।

python
try:
    data = int(user_input)
    result = 100 / data
except ValueError:
    print("Not a number")
except ZeroDivisionError:
    print("Can't divide by zero")

या एक ट्यूपल में कई पकड़ें:

python
except (ValueError, ZeroDivisionError) as e:
    print(f"Input error: {e}")

as e एक्सेप्शन ऑब्जेक्ट को एक नाम से बाइंड करता है ताकि आप संदेश का निरीक्षण कर सकें।

else और finally

else केवल तब चलता है जब कोई एक्सेप्शन नहीं हुआ हो। finally हमेशा चलता है, चाहे एक्सेप्शन हुआ हो या नहीं। finally ऐसी सफ़ाई के लिए उपयोगी है जो किसी भी स्थिति में होनी चाहिए।

else "सामान्य पथ" कोड को try बॉडी से अलग करता है, यह स्पष्ट करता है कि else में कोड केवल तब चलता है जब कोई एक्सेप्शन नहीं उठाया गया हो। finally सफ़ाई की गारंटी है: यह तब भी चलता है जब एक एक्सेप्शन उठाया गया, पकड़ा गया, या फिर से उठाया गया हो। यह return या break का सामना करने पर भी चलता है।

else तब चलता है जब try ब्लॉक बिना उठाए पूरा हो गया हो। finally बिना शर्त चलता है, return, break, continue, या असंभाले एक्सेप्शन के बाद भी। यदि finally और कॉलिंग कोड दोनों में return स्टेटमेंट हैं, तो finally का return प्राथमिकता लेता है। फ़ाइल हैंडल्स या डेटाबेस कनेक्शन के साथ finally एक द्वितीयक सुरक्षा जाल है जब with उपलब्ध नहीं है।

python
try:
    with open("data.txt") as f:
        content = f.read()
except FileNotFoundError:
    print("File not found, using defaults")
    content = ""
else:
    print("File loaded successfully")
finally:
    print("Done attempting to load file")   # हमेशा चलता है

finally सफ़ाई के लिए सबसे उपयोगी है (कनेक्शन बंद करना, लॉक रिलीज़ करना) तब भी जब आप फ़ाइलों के लिए पहले से with का उपयोग कर रहे हों।

raise

आप स्वयं raise के साथ एक्सेप्शन उठा सकते हैं। यह वह तरीका है जिससे आप अपने फ़ंक्शनों को कॉलर्स को चुपचाप गलत मान लौटाने के बजाय समस्याओं को स्पष्ट रूप से संकेत देते हैं।

raise ExceptionType("message") एक एक्सेप्शन बनाता है और उठाता है। बिना तर्क के raise except ब्लॉक के अंदर वर्तमान एक्सेप्शन को फिर से उठाता है। अपने फ़ंक्शनों से एक्सेप्शन उठाना उनकी त्रुटि स्थितियों को स्पष्ट करता है, ताकि कॉलर्स उन्हें विशेष रूप से संभाल सकें।

raise expr एक्सेप्शन इंस्टेंस प्राप्त करने के लिए expr का मूल्यांकन करता है और __traceback__ सेट करता है। अकेला raise ट्रेसबैक को संशोधित किए बिना वर्तमान एक्सेप्शन को फिर से उठाता है। raise B from A B.__cause__ = A सेट करता है (स्पष्ट चेनिंग); raise B from None संदर्भ प्रदर्शन को दबाता है। पकड़ने और लॉग करने के बाद, मूल ट्रेसबैक को संरक्षित करते हुए प्रसारित करने का स्वच्छ तरीका raise है।

python
def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero")
    return a / b

यह आपके फ़ंक्शनों को इस बारे में स्पष्ट बनाता है कि वे क्या अपेक्षा करते हैं और कॉलर्स को समस्याओं को स्पष्ट रूप से संकेत देते हैं।

कस्टम एक्सेप्शन क्लास

बड़े प्रोग्रामों के लिए, आप Exception से इनहेरिट करके अपने स्वयं के एक्सेप्शन प्रकार परिभाषित कर सकते हैं। यह कॉलर्स को आपकी विशिष्ट त्रुटियों को अन्य प्रकार की त्रुटियों से अलग पकड़ने देता है।

कस्टम एक्सेप्शन एक पदानुक्रम बनाते हैं जिसे कॉलर्स विशिष्टता के सही स्तर पर पकड़ सकते हैं। Exception को सबक्लास करना आमतौर पर वह सब है जिसकी आपको आवश्यकता है। एक्सेप्शन परिवारों के लिए, एक बेस एक्सेप्शन क्लास बनाएँ और इसे विशिष्ट त्रुटि मोड के लिए सबक्लास करें; कॉलर्स तब सभी प्रकारों को संभालने के लिए बेस प्रकार पकड़ सकते हैं।

कस्टम एक्सेप्शन को Exception को सबक्लास करना चाहिए (न कि BaseException को)। डोमेन-विशिष्ट फ़ील्ड्स के साथ __init__ जोड़ना कॉलर्स को केवल संदेश स्ट्रिंग पढ़ने के बजाय एक्सेप्शन का प्रोग्रामेटिक रूप से निरीक्षण करने देता है। एक्सेप्शन पदानुक्रम कॉलर्स को अपनी विशिष्टता का स्तर चुनने देते हैं: except PaymentError सभी भुगतान-संबंधित त्रुटियों को पकड़ता है; except InsufficientFundsError केवल उस विशिष्ट मामले को पकड़ता है।

python
class InsufficientFundsError(Exception):
    pass

class BankAccount:
    def __init__(self, balance):
        self.balance = balance

    def withdraw(self, amount):
        if amount > self.balance:
            raise InsufficientFundsError(
                f"Cannot withdraw {amount}, balance is {self.balance}"
            )
        self.balance -= amount
python
try:
    account.withdraw(1000)
except InsufficientFundsError as e:
    print(f"Transaction declined: {e}")

JSON

JSON वह प्रारूप है जो सब कुछ बोलता है: APIs, कॉन्फ़िग फ़ाइलें, डेटा निर्यात। Python का json मॉड्यूल इसे सीधे संभालता है। json.load() एक फ़ाइल से JSON पढ़कर Python dict या list में लाता है। json.dump() Python dict या list को JSON के रूप में फ़ाइल में लिखता है।

json.load() और json.dump() फ़ाइल ऑब्जेक्ट के साथ काम करते हैं। json.loads() और json.dumps() स्ट्रिंग्स के साथ काम करते हैं। dump/dumps में indent= पैरामीटर आउटपुट को मानव-पठनीय बनाता है। अमान्य JSON पर json.JSONDecodeError (जो ValueError का सबक्लास है) उठाया जाता है।

json.load() एक स्ट्रीमिंग पार्सर है: यह फ़ाइल ऑब्जेक्ट से क्रमिक रूप से पढ़ता है। json.dumps() एक स्ट्रिंग लौटाता है; json.dump() .write() का समर्थन करने वाले फ़ाइल-जैसे ऑब्जेक्ट में लिखता है। dump/dumps का default= पैरामीटर उन प्रकारों को संभालता है जो JSON-सीरियलाइज़ेबल नहीं हैं; यह असीरियलाइज़ेबल ऑब्जेक्ट प्राप्त करता है और कुछ सीरियलाइज़ेबल लौटाना चाहिए। load/loads में object_hook प्रत्येक पार्स किए गए ऑब्जेक्ट dict को इंटरसेप्ट करता है, कस्टम डीसीरियलाइज़ेशन सक्षम करता है।

फ़ाइल से JSON पढ़ें:

python
import json

with open("config.json", "r") as f:
    config = json.load(f)    # JSON को Python dict/list में पार्स करता है

print(config["setting"])

फ़ाइल में JSON लिखें:

python
import json

data = {"name": "आरव", "score": 87, "active": True}

with open("output.json", "w") as f:
    json.dump(data, f, indent=2)    # indent= इसे मानव-पठनीय बनाता है

JSON से Python प्रकार मैपिंग:

JSONPython
object {}dict
array []list
string ""str
numberint या float
true / falseTrue / False
nullNone

फ़ाइल को छुए बिना JSON स्ट्रिंग्स और Python ऑब्जेक्ट के बीच कनवर्ट करने के लिए:

python
import json

# स्ट्रिंग से Python में
data = json.loads('{"name": "आरव", "score": 87}')

# Python से स्ट्रिंग में
text = json.dumps({"name": "आरव", "score": 87}, indent=2)

json.load() एक फ़ाइल ऑब्जेक्ट से पढ़ता है। json.loads() ("s" के साथ) एक स्ट्रिंग से पढ़ता है।

व्यवहार में

एक साधारण गेम के लिए सेव/लोड पैटर्न: स्थिति को JSON में लिखें, अगली रन पर इसे वापस लोड करें, और यदि कोई सेव फ़ाइल अभी तक मौजूद नहीं है तो डिफ़ॉल्ट पर वापस आ जाएँ:

python
import json

SAVE_FILE = "save_game.json"

def save_game(player_data: dict) -> None:
    with open(SAVE_FILE, "w") as f:
        json.dump(player_data, f, indent=2)
    print("Game saved.")

def load_game() -> dict:
    try:
        with open(SAVE_FILE, "r") as f:
            return json.load(f)
    except FileNotFoundError:
        print("No save file found, starting fresh.")
        return {"name": "Player", "score": 0, "level": 1}

state = load_game()
state["score"] += 50
save_game(state)

एक कॉन्फ़िग फ़ाइल लोड करना और परिणाम सहेजना, प्रत्येक विफलता मोड के लिए विशिष्ट एक्सेप्शन हैंडलिंग के साथ:

python
import json

def load_config(path: str) -> dict:
    try:
        with open(path, "r") as f:
            return json.load(f)
    except FileNotFoundError:
        raise FileNotFoundError(f"Config file not found: {path}")
    except json.JSONDecodeError as e:
        raise ValueError(f"Invalid JSON in {path}: {e}")

def save_results(results: list[dict], path: str) -> None:
    with open(path, "w") as f:
        json.dump(results, f, indent=2)
    print(f"Saved {len(results)} result(s) to {path}")

config  = load_config("experiment.json")
results = [{"epoch": 1, "loss": 0.82}, {"epoch": 2, "loss": 0.61}]
save_results(results, "results.json")

एक संरचित लॉग राइटर जो टाइमस्टैम्प वाली प्रविष्टियों को एक फ़ाइल में जोड़ता है, एक टॉप-लेवल हैंडलर के साथ जो अप्रत्याशित विफलताओं को पकड़ता और लॉग करता है:

python
import json
from datetime import datetime

LOG_FILE = "run.log"

def log(level: str, message: str) -> None:
    ts    = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    entry = f"[{ts}] [{level.upper():7}] {message}\n"
    with open(LOG_FILE, "a") as f:
        f.write(entry)

def process(config_path: str) -> None:
    log("info", f"Starting job, config: {config_path}")
    try:
        with open(config_path) as f:
            config = json.load(f)
        log("info", f"Loaded config: {config}")
    except FileNotFoundError:
        log("error", f"Config not found: {config_path}")
        raise
    except json.JSONDecodeError as e:
        log("error", f"Bad JSON in config: {e}")
        raise

try:
    process("config.json")
except Exception as e:
    log("critical", f"Job failed: {e}")

लॉग करने के बाद फिर से उठाना कॉलर के लिए मूल ट्रेसबैक को संरक्षित करता है। टॉप-लेवल except Exception कुछ भी पकड़ता है जो छूट गया हो, इसे क्रिटिकल के रूप में लॉग करता है, और प्रक्रिया को साफ़ रूप से बाहर निकलने देता है।