ఫైల్ హ్యాండ్లింగ్, CSV & JSON ప్రాసెసింగ్

🌐 Modern Python 3.12+ 📖 Chapter 20 of 25 📁 Phase 04: ఫంక్షన్స్, మాడ్యూల్స్ & ఫైల్ I/O 🗓️ 2026 Edition
📌 Covered in this chapter: open() మోడ్స్ (r, w, a, x, b) · with కంటెక్స్ట్ మేనేజర్ (ఆటో-క్లోజ్) · టెక్స్ట్ ఫైల్స్ రీడ్ & రైట్ · csv మాడ్యూల్ · json Serialization (dump, load) · File Persistence vs RAM Volatility · open() Access Modes (r, w, a, x, b) · The with Statement Context Managers · Line-by-Line Memory Streaming · seek() & tell() Pointers · csv.DictReader & csv.DictWriter · json.dump() vs json.dumps() · Unicode UTF-8 Encoding · Enterprise ETL Ingestion Pipeline
మీ ప్రోగ్రామ్ రన్ అవుతున్నంతసేపు వేరియబుల్స్, లిస్ట్‌లు మరియు డిక్షనరీలలో ఉండే డేటా అంతా కంప్యూటర్ యొక్క తాత్కాలిక రామ్ (RAM) మెమరీలో మాత్రమే ఉంటుంది. ప్రోగ్రామ్ ఆగిపోగానే లేదా సర్వర్ రీస్టార్ట్ అవ్వగానే ఆ డేటా మొత్తం గాల్లో కలిసిపోతుంది! మరి వినియోగదారుల ఖాతా వివరాలు, ట్రాన్సాక్షన్ లాగ్‌లు, మరియు వ్యాపార నివేదికలను ఎప్పటికీ పదిలంగా దాచిపెట్టాలంటే ఏం చేయాలి?

దానికే మనకు ఫైల్ హ్యాండ్లింగ్ (File I/O) & డేటా పెర్సిస్టెన్స్ (Data Persistence) కావాలి! హార్డ్ డిస్క్‌పై ఫైళ్లను సృష్టించడం, చదవడం, మరియు సవరించడం నుండి — ఆపరేటింగ్ సిస్టమ్ ఫైల్ డిస్క్రిప్టర్ లీక్‌లను అరికట్టే మాయా కవచం with కంటెక్స్ట్ మేనేజర్ వరకు పైథాన్ అద్భుతమైన సామర్థ్యాన్ని అందిస్తుంది. అంతేకాకుండా కార్పొరేట్ డేటా ఎనలిటిక్స్ లో విరివిగా వాడే CSV (Comma-Separated Values) మరియు వెబ్ సర్వర్ల ప్రపంచ భాష అయిన JSON (JavaScript Object Notation) లను పైథాన్‌తో ఎలా డీల్ చేయాలో ఈ అధ్యాయంలో నేర్చుకుంటూ, Phase 04 కు ముగింపుగా పూర్తి స్థాయి ఎంటర్‌ప్రైజ్ ETL (Extract, Transform, Load) డేటా పైప్‌లైన్ ప్రాజెక్ట్‌ను లైవ్‌గా నిర్మిద్దాం!

1 ఫైల్ హ్యాండ్లింగ్ ఎందుకు అవసరం? (Data Persistence)

కంప్యూటర్ మెమరీ రెండు రకాలుగా ఉంటుంది:

పైథాన్‌లో ఫైల్ హ్యాండ్లింగ్ ద్వారా మనం టెక్స్ట్ ఫైల్స్ (.txt), కాన్ఫిగరేషన్ ఫైల్స్ (.ini, .env), డేటా రికార్డులు (.csv), మరియు వెబ్ పేలోడ్లను (.json) డిస్క్ నుండి చదవవచ్చు మరియు కొత్త డేటాను రాయవచ్చు.

2 open() ఫంక్షన్ & ఫైల్ యాక్సెస్ మోడ్స్ మ్యాట్రిక్స్

పైథాన్‌లో ఒక ఫైల్‌ను తెరవడానికి బిల్ట్-ఇన్ open(filename, mode, encoding) ఫంక్షన్‌ను ఉపయోగిస్తాము. ఫైల్‌ను ఏ ఉద్దేశంతో తెరుస్తున్నామో తెలిపేదే మోడ్ (Mode):

మోడ్ (Mode) వివరణ & ప్రవర్తన ఫైల్ లేకపోతే? ఫైల్ ఇప్పటికే ఉంటే?
'r' (Read) రీడ్-ఓన్లీ మోడ్ (డిఫాల్ట్). డేటాను చదవడానికి మాత్రమే. FileNotFoundError వస్తుంది! మొదటి నుండి చదువుతుంది.
'w' (Write) రైట్-ఓన్లీ మోడ్. డేటాను రాయడానికి. కొత్త ఫైల్‌ను సృష్టిస్తుంది. పాత డేటా మొత్తం తుడిచిపెట్టుకుపోతుంది! ⚠️
'a' (Append) అపెండ్ మోడ్. ఫైల్ చివరన కొత్త డేటాను జోడించడానికి. కొత్త ఫైల్‌ను సృష్టిస్తుంది. పాత డేటా అలాగే ఉంటుంది, చివర కలుస్తుంది.
'x' (Exclusive) ఎక్స్‌క్లూజివ్ క్రియేషన్. సరికొత్త ఫైల్ రాయడానికి మాత్రమే. కొత్త ఫైల్‌ను సృష్టిస్తుంది. FileExistsError విసిరి రక్షణ కల్పిస్తుంది!
'b' (Binary) బైనరీ మోడ్ (ఉదా: 'rb', 'wb'). ఇమేజెస్, PDFలు, ఆడియోల కోసం. మోడ్‌ను బట్టి రా బైట్స్ (raw bytes) చదువుతుంది.

3 The with స్టేట్‌మెంట్ & కంటెక్స్ట్ మేనేజర్స్ (Zero Leaks)

సాంప్రదాయ పద్ధతిలో ఫైల్‌ను ఓపెన్ చేసిన తర్వాత తప్పనిసరిగా f.close() చేయాలి. కానీ కోడ్ మధ్యలో ఏదైనా ఎర్రర్ వస్తే close() లైన్ ఎగ్జిక్యూట్ కాక ఆపరేటింగ్ సిస్టమ్ యొక్క ఫైల్ డిస్క్రిప్టర్ లీక్ (File Descriptor Leak) అవుతుంది.

ఈ సమస్యకు పైథాన్ అందించే అంతిమ పరిష్కారమే with కంటెక్స్ట్ మేనేజర్:

# ప్రొడక్షన్ గోల్డెన్ ప్యాటర్న్:
with open("server_audit.log", "r", encoding="utf-8") as f:
    content = f.read()
# with బ్లాక్ ముగియగానే లేదా మధ్యలో ఎర్రర్ వచ్చినా సరే — ఫైల్ ఆటోమేటిక్‌గా క్లోజ్ అవుతుంది!

తెరవెనుక పైథాన్ __enter__() మరియు __exit__() అనే స్పెషల్ మెథడ్స్ ద్వారా ఫైల్ హ్యాండిల్ స్వయంచాలకంగా విడుదలయ్యేలా హామీ ఇస్తుంది.

4 టెక్స్ట్ ఫైల్స్ రీడింగ్ టెక్నిక్స్ (Memory-Efficient Streaming)

ఫైల్ నుండి డేటాను చదవడానికి నాలుగు విధానాలు ఉన్నాయి:

5 టెక్స్ట్ ఫైల్స్ రైటింగ్ & flush() ఇంటర్నల్స్

ఫైల్‌లోకి డేటాను రాయడానికి f.write(text) లేదా బహుళ లైన్లను రాయడానికి f.writelines(list_of_lines) వాడతాము.

6 ఫైల్ పాయింటర్ నావిగేషన్ (tell() & seek())

ఫైల్‌లో మనం ప్రస్తుతం ఎక్కడ చదువుతున్నామో తెలిపే కర్సర్ లేదా పాయింటర్‌ను నియంత్రించే మెథడ్స్:

7 కోడ్ డెమో 1: లైవ్ సిస్టమ్ లాగ్ ఫైల్ జనరేటర్ & రీడర్

with open(), append మోడ్, మరియు లైన్-బై-లైన్ రీడింగ్ ద్వారా లైవ్ లాగర్ ఇంప్లిమెంటేషన్‌ను పరిశీలిద్దాం:

01_file_logging_and_streaming.py
# =====================================================================
# చాప్టర్ 20 డెమో 1: ఫైల్ రైటింగ్ & మెమరీ-ఎఫిషియంట్ లైన్ స్ట్రీమింగ్
# =====================================================================
import os
from datetime import datetime

log_file_name = "app_runtime_audit.txt"

# 1. WRITE & APPEND: లాగ్ డేటాను ఫైల్‌లో నమోదు చేయడం
audit_events = [
    ("INFO", "డేటాబేస్ సర్వర్ కనెక్షన్ విజయవంతం"),
    ("WARNING", "మెమరీ వినియోగం 82% కి చేరింది"),
    ("CRITICAL", "పేమెంట్ గేట్‌వే రెస్పాన్స్ టైమౌట్!"),
    ("INFO", "ఆటోమేటిక్ బ్యాకప్ ప్రక్రియ పూర్తయింది")
]

with open(log_file_name, "w", encoding="utf-8") as f:
    for level, msg in audit_events:
        t_stamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        f.write(f"[{t_stamp}] [{level:<8}] {msg}\n")

print(f"✅ లాగ్ డేటా విజయవంతంగా '{log_file_name}' లో రాయబడింది!")

# 2. READ: లైన్-బై-లైన్ స్ట్రీమింగ్ ద్వారా ఫైల్‌ను చదవడం
print("\n=== ఫైల్ నుండి చదివిన లాగ్స్ (Line-by-Line Streaming) ===")
with open(log_file_name, "r", encoding="utf-8") as f:
    for line_num, line in enumerate(f, start=1):
        print(f"వరుస {line_num}: {line.strip()}")

# క్లీనప్ (టెస్ట్ ఫైల్ తొలగింపు)
if os.path.exists(log_file_name):
    os.remove(log_file_name)

8 csv మాడ్యూల్ — స్ప్రెడ్‌షీట్ డేటా రీడింగ్ & రైటింగ్

CSV (Comma-Separated Values) అనేది ఎక్సెల్ స్ప్రెడ్‌షీట్‌లు మరియు డేటాబేస్ టేబుల్స్ మధ్య సమాచారాన్ని ఇచ్చిపుచ్చుకోవడానికి వాడే అత్యంత ప్రసిద్ధ ఫార్మాట్.

పైథాన్ స్టాండర్డ్ csv మాడ్యూల్ దీనికి రెండు ఉన్నతమైన క్లాస్‌లను అందిస్తుంది:

9 json మాడ్యూల్ — వెబ్ API డేటా సీరియలైజేషన్

JSON (JavaScript Object Notation) అనేది వెబ్ APIలు, క్లౌడ్ సర్వీసులు మరియు కాన్ఫిగరేషన్లలో వాడే గ్లోబల్ స్టాండర్డ్.

పైథాన్ అంతర్నిర్మిత json మాడ్యూల్‌లోని 4 ప్రధాన మెథడ్స్ మధ్య వ్యత్యాసం:

1. మెమరీ స్ట్రింగ్స్: dumps & loads (s = string)

పైథాన్ ఆబ్జెక్ట్‌ను JSON స్ట్రింగ్‌గా మార్చడానికి json.dumps(), JSON స్ట్రింగ్‌ను పైథాన్ డిక్షనరీగా మార్చడానికి json.loads() వాడతాము.

json_str = json.dumps({"active": True})
py_dict = json.loads(json_str)

2. డిస్క్ ఫైల్స్: dump & load (File Pointers)

నేరుగా ఫైల్ పాయింటర్‌లోకి రాయడానికి json.dump(obj, f), ఫైల్ నుండి చదవడానికి json.load(f) వాడతాము.

json.dump(data, f, indent=2)
data = json.load(f)

10 కోడ్ డెమో 2: తెలుగు యూనికోడ్ సపోర్ట్‌తో JSON ప్రాసెసింగ్

డిఫాల్ట్‌గా json.dumps() తెలుగు అక్షరాలను తె వంటి ఎస్కేప్ కోడ్స్‌గా మారుస్తుంది. స్పష్టమైన తెలుగు అక్షరాలు కనిపించాలంటే ensure_ascii=False అని పేర్కొనాలి:

02_json_unicode_serialization.py
# JSON సీరియలైజేషన్ & తెలుగు యూనికోడ్ డెమో
import json

app_config = {
    "app_name": "మన కంపైలర్ పోర్టల్",
    "version": "3.12.2",
    "supported_languages": ["పైథాన్", "జావా", "సి++", "సి#"],
    "settings": {
        "theme": "లైట్ మోడ్",
        "auto_save": True,
        "max_timeout_sec": 15
    }
}

# ensure_ascii=False ద్వారా స్పష్టమైన తెలుగు ప్రింటింగ్
json_output = json.dumps(app_config, indent=2, ensure_ascii=False)
print("=== ఫార్మాట్ చేయబడిన JSON అవుట్‌పుట్ ===")
print(json_output)

11 బైనరీ ఫైల్స్ హ్యాండ్లింగ్ (rb & wb)

చిత్రాలు (PNG/JPG), ఆడియో ఫైల్స్, లేదా PDFలను టెక్స్ట్ మోడ్‌లో చదివితే కరప్ట్ అయిపోతాయి. వాటిని బైనరీ మోడ్ ('rb', 'wb') లో మాత్రమే చదవాలి.

# ఒక ఇమేజ్ ఫైల్‌ను మరొక చోటుకి బైట్-బై-బైట్ కాపీ చేయడం:
with open("source_logo.png", "rb") as src, open("backup_logo.png", "wb") as dst:
    while chunk := src.read(4096): # 4 KB Chunks లో చదవడం
        dst.write(chunk)

12 కామన్ బిగినర్స్ మిస్టేక్స్ & ప్రొడక్షన్ బెస్ట్ ప్రాక్టీసెస్

13 రియల్-వరల్డ్ ప్రాజెక్ట్: "Enterprise ETL Data Ingestion & Customer Audit Pipeline"

ఈ ఇరవైయవ అధ్యాయంలో నేర్చుకున్న అన్ని అంశాలను (ఫైల్ I/O, with open(), CSV DictReader, JSON serialization, UTF-8 ఎన్‌కోడింగ్, డేటా ట్రాన్స్‌ఫార్మేషన్) మిళితం చేస్తూ — ఒక రా CSV కస్టమర్ ట్రాన్సాక్షన్ డేటాను వెలికితీసి (Extract), క్లీన్ చేసి (Transform), మరియు ఆడిట్ అయిన JSON డేటాబేస్‌గా లోడ్ చేసే (Load) పూర్తి స్థాయి Enterprise ETL Data Ingestion Pipeline ను నిర్మిద్దాం!

03_enterprise_etl_pipeline.py
# =====================================================================
# చాప్టర్ 20 మినీ ప్రాజెక్ట్: Enterprise ETL Data Ingestion Pipeline
# కాన్సెప్ట్స్: File I/O, csv.DictReader, json.dump, UTF-8 Encoding,
#             Data Transformation, Error Resilience, Audit Persistence
# =====================================================================
import csv
import json
import os

CSV_SOURCE_FILE = "raw_customer_transactions.csv"
JSON_AUDIT_DEST = "clean_customer_audit.json"

# 1. రా CSV డేటాను ఫైల్‌లో సిమ్యులేట్ చేయడం (Extract Phase)
raw_csv_content = """cust_id,cust_name,city,plan,amount_paid,status
C101,సురేష్ వర్మ,హైదరాబాద్,Enterprise,45000.0,SUCCESS
C102,కవిత రాణి,విజయవాడ,Professional,18500.0,SUCCESS
C103,అశోక్ కుమార్,విశాఖపట్నం,Basic,4999.0,PENDING
C104,మనోజ్ కృష్ణ,వరంగల్,Enterprise,45000.0,SUCCESS
C105,దివ్య శర్మ,తిరుపతి,Professional,18500.0,FAILED
"""

with open(CSV_SOURCE_FILE, "w", encoding="utf-8", newline="") as f:
    f.write(raw_csv_content.strip())

def execute_enterprise_etl_pipeline():
    """రా CSV నుండి డేటాను చదివి, ట్రాన్స్‌ఫార్మ్ చేసి, JSON లోకి లోడ్ చేస్తుంది."""
    print("\n" + "=" * 74)
    print(f"{'🔄 మన ఎంటర్‌ప్రైజ్ — ETL డేటా ప్రాసెసింగ్ & ఆడిట్ పైప్‌లైన్ 2026':^74}")
    print("=" * 74)

    extracted_records = []
    total_revenue_inr = 0.0

    # 1. EXTRACT: csv.DictReader ద్వారా చదవడం
    with open(CSV_SOURCE_FILE, "r", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            # 2. TRANSFORM: డేటా క్లీనింగ్ & బిజినెస్ లాజిక్
            status = row["status"].strip().upper()
            amount = float(row["amount_paid"])

            is_verified = (status == "SUCCESS")
            if is_verified:
                total_revenue_inr += amount

            transformed_cust = {
                "customer_id": row["cust_id"],
                "full_name": row["cust_name"],
                "location": row["city"],
                "subscription_tier": row["plan"],
                "payment": {
                    "amount_inr": amount,
                    "payment_status": status,
                    "verified": is_verified
                }
            }
            extracted_records.append(transformed_cust)

    # ఆడిట్ సమ్మరీ కంటైనర్
    final_audit_payload = {
        "pipeline_version": "2026.1",
        "total_records_ingested": len(extracted_records),
        "total_revenue_cleared_inr": total_revenue_inr,
        "customers": extracted_records
    }

    # 3. LOAD: json.dump ద్వారా శాశ్వత డిస్క్ ఫైల్‌లోకి భద్రపరచడం
    with open(JSON_AUDIT_DEST, "w", encoding="utf-8") as f:
        json.dump(final_audit_payload, f, indent=2, ensure_ascii=False)

    print(f"✅ మొత్తం సేకరించిన రికార్డులు  : {len(extracted_records)}")
    print(f"✅ క్లియర్ అయిన మొత్తం రాబడి   : ₹{total_revenue_inr:,.2f}")
    print(f"📁 డేటా విజయవంతంగా భద్రపరచబడింది: '{JSON_AUDIT_DEST}'")
    print("-" * 74)

    # ధృవీకరణ కోసం JSON నుండి తిరిగి చదవడం (Verification)
    with open(JSON_AUDIT_DEST, "r", encoding="utf-8") as f:
        saved_audit = json.load(f)

    print(f"{'కస్టమర్ ID':<12} {'పేరు':<18} {'నగరం':<14} {'ప్లాన్':<14} {'చెల్లింపు స్థితి':^12}")
    print("-" * 74)
    for c in saved_audit["customers"]:
        p_status = c["payment"]["payment_status"]
        status_icon = "🟢 సక్సెస్" if p_status == "SUCCESS" else ("🟡 పెండింగ్" if p_status == "PENDING" else "🔴 విఫలం")
        print(f"{c['customer_id']:<12} {c['full_name']:<18} {c['location']:<14} {c['subscription_tier']:<14} {status_icon:^12}")

    print("=" * 74)
    print(f"{'🎉 Phase 04 ముగింపు ETL పైప్‌లైన్ విజయవంతంగా పూర్తయింది!':^74}")
    print("=" * 74 + "\n")

    # క్లీనప్
    if os.path.exists(CSV_SOURCE_FILE): os.remove(CSV_SOURCE_FILE)
    if os.path.exists(JSON_AUDIT_DEST): os.remove(JSON_AUDIT_DEST)

execute_enterprise_etl_pipeline()

★ ఈ అధ్యాయంపై ప్రాక్టీస్ క్విజ్ (Knowledge Check)

1. ఫైల్స్ తెరిచేటప్పుడు with స్టేట్‌మెంట్‌ను ఎందుకు తప్పనిసరిగా వాడాలి?
సమాధానం: with స్టేట్‌మెంట్ ఒక కంటెక్స్ట్ మేనేజర్‌గా పనిచేస్తుంది. కోడ్ బ్లాక్ పూర్తయిన వెంటనే లేదా మధ్యలో ఏదైనా రన్‌టైమ్ ఎక్సెప్షన్ వచ్చినా సరే, అది స్వయంచాలకంగా f.close() ను కాల్ చేసి ఆపరేటింగ్ సిస్టమ్ మెమరీ లీక్స్ రాకుండా రక్షిస్తుంది.
2. json.dumps() మరియు json.dump() ల మధ్య తేడా ఏమిటి?
సమాధానం: json.dumps() పైథాన్ ఆబ్జెక్ట్‌ను ఒక స్ట్రింగ్ (String) రూపంలోకి మారుస్తుంది. json.dump() నేరుగా ఒక తెరిచిన ఫైల్ పాయింటర్‌లోకి (File Stream) డేటాను రాస్తుంది.
3. ఫైల్ ఓపెన్ చేసేటప్పుడు encoding='utf-8' పేర్కొనకపోతే ఏం జరుగుతుంది?
సమాధానం: పైథాన్ ఆపరేటింగ్ సిస్టమ్ యొక్క డిఫాల్ట్ ఎన్‌కోడింగ్‌ను (విండోస్‌లో cp1252/charmap) తీసుకుంటుంది. అందువల్ల తెలుగు అక్షరాలు, యూనికోడ్ క్యారెక్టర్లు లేదా ఎమోజీలు ఉన్నప్పుడు UnicodeDecodeError వచ్చి ప్రోగ్రామ్ క్రాష్ అవుతుంది.
4. CSV ఫైల్ రాసేటప్పుడు newline='' ఎందుకు ఇవ్వాలి?
సమాధానం: విండోస్ సిస్టమ్స్‌లో పైథాన్ సాధారణంగా న్యూలైన్లను రాస్తుంది. CSV మాడ్యూల్ కూడా తన స్వంత న్యూలైన్‌ను జోడించడం వల్ల ప్రతి రెండు వరుసల మధ్య ఒక ఖాళీ లైన్ వస్తుంది. newline='' ఇవ్వడం వల్ల ఈ డబుల్ న్యూలైన్ ట్రాప్ నివారించబడుతుంది.
5. f.seek(0) కమాండ్ ఏం చేస్తుంది?
సమాధానం: ఫైల్ కర్సర్ లేదా పాయింటర్‌ను ఫైల్ యొక్క మొట్టమొదటి బైట్‌కు (ప్రారంభ స్థానానికి) తరలిస్తుంది. దీని ద్వారా ఫైల్‌ను క్లోజ్ చేసి మళ్లీ ఓపెన్ చేయాల్సిన అవసరం లేకుండానే మొదటి నుండి చదవవచ్చు.
← మునుపటి అధ్యాయం: 19. మాడ్యూల్స్ & pip తర్వాతి అధ్యాయం: 21. OOP క్లాసెస్ & ఆబ్జెక్ట్స్ →

ఈ Enterprise ETL Ingestion Pipeline ని లైవ్‌గా మన కంపైలర్‌లో రన్ చేయండి!

ఎటువంటి లోకల్ సెటప్ లేకుండా, బ్రౌజర్‌లోనే Modern Python 3 కంపైలర్‌లో ఈ కోడ్‌ను ఎగ్జిక్యూట్ చేసి అవుట్‌పుట్ తనిఖీ చేయండి.