📘 CodingMarble Learn

पायथन में फ़ाइल प्रबंधन: ऐसा डेटा सहेजें जो टिके

प्रोग्राम ख़त्म होते ही वेरिएबल मिट जाते हैं; फ़ाइलें डेटा डिस्क पर रखती हैं। टेक्स्ट फ़ाइल पंक्तियों में अक्षर रखती है, बाइनरी फ़ाइल कच्चे बाइट (जैसे pickle किए पायथन ऑब्जेक्ट), और CSV फ़ाइल अल्पविराम से अलग तालिका की पंक्तियाँ। फ़ाइल open(path, mode) से खुलती है; पाथ absolute या relative, मोड r, w, a, r+, rb, wb आदि। with फ़ाइल को अपने-आप बंद करता है। टेक्स्ट फ़ाइल में write, writelines, read, readline, readlines। seek फ़ाइल पॉइंटर खिसकाता है, tell उसकी जगह बताता है। pickle.dump और pickle.load से ऑब्जेक्ट सहेजते-पढ़ते हैं, जिससे रिकॉर्ड खोजना, जोड़ना और बदलना होता है। csv मॉड्यूल का writer (writerow, writerows) और reader CSV सँभालते हैं।

🎬 कदम-दर-कदम कहानी

  1. फ़ाइल डिस्क पर बाइटों की एक कतार है। फ़ाइल पॉइंटर (कर्सर) बताता है कि अगला पढ़ना या लिखना कहाँ होगा।
  2. मोड शुरुआत तय करता है: r शुरू से पढ़ता है, w पहले फ़ाइल साफ़ करता है, a कर्सर अंत पर रखता है ताकि नया डेटा जुड़े।
  3. read(5) 5 अक्षर लेता है और कर्सर 5 आगे खिसकता है। readline() अगली newline तक लेता है। tell() कर्सर की जगह बताता है; seek(0) शुरू पर लौटाता है।
  4. pickle.dump पायथन लिस्ट या डिक्शनरी को बाइटों में बदलकर बाइनरी फ़ाइल में लिखता है। pickle.load उसे वापस वही ऑब्जेक्ट बनाता है।
  5. CSV फ़ाइल टेक्स्ट में सहेजी तालिका है: हर पंक्ति एक लाइन, मानों के बीच अल्पविराम। csv.writer पंक्तियाँ लिखता है; csv.reader हर पंक्ति लिस्ट बनाकर देता है।
  6. आपकी बारी: seek स्लाइडर खिसकाएँ और चुनें कितने अक्षर पढ़ने हैं। tell() और मिला टेक्स्ट देखें।

टिप: 3D दृश्य को घुमाने के लिए खींचें। ज़ूम के लिए दो उंगलियाँ इस्तेमाल करें।

🤔 आम शंकाएँ और उनके जवाब

प्रोग्राम ख़त्म होने के बाद डेटा कहाँ जाता है?

डिस्क की फ़ाइल में। RAM के वेरिएबल की तरह नहीं, बिजली बंद होने पर भी वहीं रहता है।

मैंने फ़ाइल 'w' में खोली और सब मिट गया। क्यों?

'w' हमेशा पहले फ़ाइल साफ़ करता है। जोड़ने के लिए 'a' लें, जो कर्सर अंत पर रखता है।

दूसरे read() ने ख़ाली स्ट्रिंग क्यों दी?

पहले read() ने कर्सर अंत पर पहुँचा दिया। शुरू पर लौटने को f.seek(0) करें।

read(), readline() और readlines() में क्या अंतर है?

read() बची फ़ाइल एक स्ट्रिंग में, readline() एक पंक्ति, readlines() सारी पंक्तियों की लिस्ट।

pickle का डेटा नोटपैड में क्यों नहीं दिखता?

pickle अक्षर नहीं, बाइट रखता है। केवल pickle.load उन्हें ऑब्जेक्ट में बदल सकता है।

csv.reader से संख्याएँ स्ट्रिंग क्यों आती हैं?

CSV सादा टेक्स्ट है, इसलिए हर मान टेक्स्ट बनकर आता है। int() या float() से बदलें।

फ़ाइल क्यों? टेक्स्ट, बाइनरी और CSV फ़ाइलें

वेरिएबल का डेटा RAM में रहता है और प्रोग्राम ख़त्म होते ही मिट जाता है। फ़ाइल डेटा को डिस्क पर स्थायी रूप से रखती है।

Absolute और relative पाथ

पाथ पायथन को बताता है कि फ़ाइल कहाँ है।

Windows पाथ में r'C:\School\marks.txt' (raw string) लिखें या दोहरे बैकस्लैश, क्योंकि पाथ के अंदर \n या \t विशेष अक्षर बन जाते हैं।

फ़ाइल खोलना-बंद करना: ओपन मोड और with

f = open('marks.txt', 'r') एक फ़ाइल ऑब्जेक्ट (फ़ाइल हैंडल) देता है। काम के बाद f.close() ज़रूर करें; बंद करने से बफ़र में रुका डेटा भी सहेजा जाता है।

मोडअर्थफ़ाइल न हो तोकर्सर
rकेवल पढ़ना (डिफ़ॉल्ट)FileNotFoundErrorशुरू
wकेवल लिखना, पुराना डेटा मिटता हैबना देता हैशुरू
aजोड़ना (अंत में)बना देता हैअंत
r+पढ़ना और लिखनाएररशुरू
w+लिखना और पढ़ना, मिटाकरबना देता हैशुरू
a+जोड़ना और पढ़नाबना देता हैअंत

बाइनरी के लिए b जोड़ें: rb, wb, ab, rb+, wb+, ab+।

with स्टेटमेंट

with open('marks.txt', 'r') as f:
    data = f.read()
# यहाँ फ़ाइल अपने-आप बंद

with खंड ख़त्म होते ही फ़ाइल बंद कर देता है, अपवाद आने पर भी।

टेक्स्ट फ़ाइल में लिखना: write और writelines

with open('poem.txt', 'w') as f:
    f.write('Roses are red\n')
    f.writelines(['Sky is blue\n', 'Python is fun\n'])

बिना मिटाए जोड़ना हो तो 'a' मोड लें।

टेक्स्ट फ़ाइल पढ़ना: read, readline, readlines

# 'T' से शुरू होने वाली पंक्तियाँ गिनो
c = 0
with open('poem.txt') as f:
    for line in f:
        if line.startswith('T'):
            c += 1
print(c)

अंत का newline हटाने को line.strip(), शब्दों में तोड़ने को line.split()।

seek() और tell(): फ़ाइल पॉइंटर खिसकाना

फ़ाइल पॉइंटर वह जगह (शुरू से बाइटों में) है जहाँ अगला पढ़ना या लिखना होगा।

with open('poem.txt') as f:
    print(f.read(5))   # 'Roses'
    print(f.tell())    # 5
    f.seek(0)
    print(f.read(3))   # 'Ros'

pickle से बाइनरी फ़ाइल: dump और load

Pickling (सीरियलाइज़ेशन) पायथन ऑब्जेक्ट को बाइटों की धारा में बदलना है। Unpickling बाइटों को वापस ऑब्जेक्ट बनाना।

import pickle
rec = {'roll': 1, 'name': 'Asha', 'marks': 92}
with open('stu.dat', 'wb') as f:
    pickle.dump(rec, f)

with open('stu.dat', 'rb') as f:
    r = pickle.load(f)
print(r['name'])   # Asha

हर dump एक ऑब्जेक्ट लिखता है। सब पढ़ने के लिए EOFError आने तक लूप में load:

with open('stu.dat', 'rb') as f:
    try:
        while True:
            print(pickle.load(f))
    except EOFError:
        pass

बाइनरी फ़ाइल में खोज, जोड़ना और बदलना

जोड़ना (append)

'ab' में खोलें और नया रिकॉर्ड pickle.dump करें। पुराने रिकॉर्ड बने रहते हैं।

खोज (search)

'rb' में खोलें, एक-एक रिकॉर्ड load करें और फ़ील्ड जाँचें: if r['roll'] == 5: print(r); found = True। लूप के बाद found अब भी False हो तो 'नहीं मिला' छापें।

बदलना (update)

तरीका 1 (आसान): सारे रिकॉर्ड लिस्ट में लोड करें, मेल खाता बदलें, फिर फ़ाइल 'wb' में खोलकर सब दोबारा dump करें।

recs = []
with open('stu.dat', 'rb') as f:
    try:
        while True:
            recs.append(pickle.load(f))
    except EOFError:
        pass
for r in recs:
    if r['roll'] == 2:
        r['marks'] = 80
with open('stu.dat', 'wb') as f:
    for r in recs:
        pickle.dump(r, f)

तरीका 2 (उसी जगह): 'rb+' में खोलें, हर load से पहले pos = f.tell() नोट करें, और मेल मिलने पर f.seek(pos) करके बदला रिकॉर्ड dump करें (जब नए रिकॉर्ड का बाइट आकार वही हो)।

CSV फ़ाइलें: csv.writer और csv.reader

import csv
with open('class.csv', 'w', newline='') as f:
    w = csv.writer(f)
    w.writerow(['Roll', 'Name', 'Marks'])
    w.writerows([[1, 'Asha', 92], [2, 'Ravi', 75]])

with open('class.csv', 'r') as f:
    for row in csv.reader(f):
        print(row)       # ['1', 'Asha', '92'] …

करके देखें: छोटी डायरी

ऐसा प्रोग्राम लिखिए जो एक पंक्ति पूछे और उसे 'a' मोड से diary.txt में जोड़े। तीन बार चलाइए। अब एक बार 'w' मोड में खोलकर एक पंक्ति लिखिए। हर बार के बाद diary.txt नोटपैड में खोलिए। आप ख़ुद देखेंगे कि 'w' ने सब मिटा दिया। फिर 3D के आख़िरी कदम में अनुमान लगाइए कि seek और read(n) क्या देंगे।

मुख्य सूत्र और परिभाषाएँ

हल किए गए उदाहरण

1. कौन-सा मोड लेंगे: (a) पुरानी पंक्तियाँ खोए बिना लॉग में नई जोड़ना (b) हर बार नई रिपोर्ट फ़ाइल बनाना (c) सहेजा बाइनरी रिकॉर्ड पढ़ना?

(a) 'a' (कर्सर अंत पर)। (b) 'w' (बनाता या मिटाता है)। (c) 'rb' (बाइनरी पढ़ना)।

2. poem.txt में है 'Roses are red\nSky is blue\n'। f.readline(), फिर f.read(3), फिर f.tell() क्या देंगे?

readline() → 'Roses are red\n' (14 अक्षर: 13 + newline)। read(3) → 'Sky'। tell() → 14 + 3 = 17 (जहाँ newline 1 बाइट है)।

3. story.txt के शब्द गिनने वाला फ़ंक्शन लिखिए।

def count_words(): with open('story.txt') as f: return len(f.read().split()) print(count_words())

4. notes.txt की 20 अक्षरों से छोटी पंक्तियाँ दिखाने वाला फ़ंक्शन लिखिए।

def short_lines(): with open('notes.txt') as f: for line in f: if len(line.rstrip('\n')) < 20: print(line, end='')

5. बाइनरी फ़ाइल book.dat में रिकॉर्ड [book_no, title, price] हैं। एक रिकॉर्ड जोड़ने का फ़ंक्शन लिखिए।

import pickle def add_book(): rec = [int(input('No: ')), input('Title: '), float(input('Price: '))] with open('book.dat', 'ab') as f: pickle.dump(rec, f)

6. book.dat से 300 से महँगी सारी किताबें दिखाइए; एक भी न मिले तो बताइए।

def costly(): found = False with open('book.dat', 'rb') as f: try: while True: r = pickle.load(f) if r[2] > 300: print(r); found = True except EOFError: pass if not found: print('No such book')

7. book.dat में किताब नंबर 3 की कीमत 450 कीजिए।

सारे रिकॉर्ड EOFError तक लिस्ट में लोड करें, जहाँ r[0] == 3 वहाँ r[2] = 450 करें, फिर 'wb' में खोलकर हर रिकॉर्ड दोबारा dump करें। पूरी फ़ाइल फिर से लिखनी है, इसलिए 'wb'।

8. दो फ़ंक्शन लिखिए: contacts.csv में [id, name, phone] पंक्तियाँ जोड़ना, और सब संपर्कों के नाम छापना।

import csv def add(rows): with open('contacts.csv', 'a', newline='') as f: csv.writer(f).writerows(rows) def names(): with open('contacts.csv') as f: for row in csv.reader(f): print(row[1])

आम गलतियाँ

अभ्यास क्विज़

1. कौन-सा मोड फ़ाइल का पुराना डेटा मिटा देता है?
2. readlines() क्या लौटाता है?
3. फ़ाइल पॉइंटर की अभी की जगह कौन बताता है?
4. फ़ाइल के अंत पर pickle.load() कौन-सा अपवाद उठाता है?
5. CSV फ़ाइल में एक साथ कई पंक्तियाँ कौन लिखता है?

अभ्यास: खुद जवाब दो

अपना जवाब लिखो या चुनो, फिर जाँचें दबाओ। अटको तो संकेत देखो; जवाब देने के बाद पूरा हल दिखेगा।

अक्सर पूछे जाने वाले प्रश्न

कक्षा 12 में पायथन फ़ाइलों के प्रकार कौन-से हैं?

टेक्स्ट फ़ाइल (पढ़ने योग्य अक्षर), बाइनरी फ़ाइल (कच्चे बाइट, pickle के साथ) और CSV फ़ाइल (अल्पविराम से अलग तालिका की पंक्तियाँ)।

seek() और tell() में क्या अंतर है?

tell() बताता है कि फ़ाइल पॉइंटर अभी कहाँ है। seek() पॉइंटर को नई जगह भेजता है।

write() और writelines() में क्या अंतर है?

write() एक स्ट्रिंग लिखता है। writelines() लिस्ट की हर स्ट्रिंग लिखता है। कोई भी अपने-आप newline नहीं जोड़ता।

यह कहाँ पढ़ाया जाता है

रोमानियाClasa a IX-aStoring data and organising code in a programming language
रोमानियाClasa a IX-aStoring data and organising code in a programming language
रोमानियाClasa a IX-aStoring data and organising code in a programming language
रोमानियाClasa a X-aStructured data
सीबीएसई (भारत)कक्षा 12संगणनात्मक चिंतन और प्रोग्रामिंग - 2
अमेरिकाGrade 11Data Collections
दक्षिण कोरिया고등학교 2학년Algorithms and programming
दक्षिण कोरिया고등학교 3학년Programming
रूस10 классAlgorithms and programming

पहले यह पढ़ें

आगे पढ़ें

इससे जुड़े पाठ

सभी कंप्यूटर विज्ञान पाठ