کار با فایل‌ها (File I/O)؛ وقتی پایتون دفتر خاطراتش رو باز می‌کنه
تا حالا هرچی کد زدیم، خروجی‌مون روی صفحهٔ سیاه کنسول چاپ شد و بعد از بستن برنامه، دود شد رفت هوا. اما دنیای واقعی اینطور نیست. برنامه‌ها باید بتونن اطلاعات رو ذخیره کنن و بعداً بخوننش. لیست خرید، نمرات دانشجوها، لاگ‌های یه ربات، عکس و آهنگ... همه و همه توی فایل‌ها زندگی می‌کنن.

امروز قراره به پایتون یاد بدیم چطور با فایل‌ها حرف بزنه. از باز کردن یه فایل ساده گرفته، تا خوندن خط‌به‌خط، نوشتن اطلاعات جدید و مهم‌تر از همه، درست بستن فایل که خرابکاری نشه. مثل اینه که به پایتون دفتر و خودکار بدیم و بگیم: «بنویس، بعداً می‌خونیم!»

چرا کار با فایل اینقدر مهمه؟
برنامه‌ای که نتونه داده‌هاش رو نگه داره، مثل آدمی می‌مونه که هر شب حافظه‌ش پاک می‌شه. فایل‌ها حافظهٔ بلندمدت برنامه‌ان. هر وقت خواستی:

تنظیمات برنامه رو ذخیره کنی،

گزارش عملکرد یه ربات رو ثبت کنی،

داده‌های کاربر رو برای دفعهٔ بعد یادت بمونه،

یا با فایل‌های CSV، JSON، عکس و... کار کنی،

نیاز داری راه و رسم File I/O رو بلد باشی. پایتون هم مثل همیشه این کار رو به ساده‌ترین و خفن‌ترین شکل ممکن درآورده.

باز کردن فایل با open() – سلام، بیا تو!
همه‌چیز با تابع open() شروع می‌شه. این تابع یه فایل رو باز می‌کنه و یه "دستهٔ فایل" (File Handle) بهت می‌ده که باهاش می‌تونی بخونی، بنویسی یا هر دو. مثل اینه که کتاب رو باز می‌کنی تا صفحه‌هاش رو ببینی.


file = open("filename.txt", "mode")


پارامتر اول اسم فایله (اگر در مسیر فعلی نباشه، آدرس کامل رو می‌دی). پارامتر دوم حالت (Mode) باز کردن فایل رو مشخص می‌کنه. سه حالت اصلی که فعلاً باهاشون کار داریم:

تصویر

نکته‌های خفن:

"r" پیش‌فرضه، یعنی اگه چیزی نگی، open("test.txt") یعنی برای خواندن باز کن.

"w" یه کم خطرناکه: همهٔ محتوای قبلی فایل رو پاک می‌کنه و از نو می‌نویسه. مثل اینه که دفتر رو پاره کنی و از اول شروع کنی. مواظب باش!

"a" بی‌آزارتره: میاد انتهای فایل، هر چی جدید هست رو اضافه می‌کنه بدون اینکه به قبلی‌ها دست بزنه.

می‌تونی حالت‌های ترکیبی هم داشته باشی مثل "r+" (خواندن و نوشتن) که بعداً یاد می‌گیری.

خوندن از فایل – پایتون کتاب می‌خونه
حالا که فایل بازه، چطور محتواش رو بخونیم؟ سه تا روش داریم که هر کدوم به یه درد می‌خوره:

۱. read() – همه رو یه جا بده
کل محتوای فایل رو به صورت یه رشتهٔ گنده برمی‌گردونه. اگه فایل کوچیک باشه (مثلاً یه تنظیمات ساده)، بهترین گزینه‌ست:


file = open("poem.txt", "r", encoding="utf-8")
content = file.read()
print(content)
file.close()


اگه فایلت متن فارسی داره، حتماً encoding="utf-8" رو بذار وگرنه با کاراکترهای عجیب‌غریب مواجه می‌شی. پایتون بعضی وقتا تو خوندن فارسی غافلگیر می‌کنه، پس این پرچم رو فراموش نکن.

۲. readline() – خط به خط بخون
هر بار که readline() رو صدا بزنی، یه خط از فایل رو می‌خونه (تا جایی که \n ببینه). انگار با انگشت خط رو دنبال می‌کنی:


file = open("grocery.txt", "r", encoding="utf-8")
first_line = file.readline()  # خط اول
second_line = file.readline() # خط دوم
print(first_line.strip())    # strip() اون \n آخر خط رو حذف می‌کنه
print(second_line.strip())
file.close()


۳. readlines() – همه خطوط رو بریز تو لیست
همهٔ خطوط فایل رو می‌خونه و یه لیست از رشته‌ها برمی‌گردونه. هر عنصر لیست، یه خط کامله (با همان \n آخرش). برای حلقه زدن و پردازش عالیه:


file = open("students.txt", "r", encoding="utf-8")
lines = file.readlines()
for line in lines:
    print(f"→ {line.strip()}")
file.close()


۴. حلقهٔ مستقیم روی فایل – خفن‌ترین راه
کمتر کسی می‌دونه که خود File Handle رو می‌تونی مستقیم توی یه for بندازی. پایتون خودش خط‌به‌خط فایل رو می‌خونه و حافظه رو هم الکی درگیر نمی‌کنه. بهترین روش برای فایل‌های بزرگ:


file = open("big_data.log", "r", encoding="utf-8")
for line in file:
    print(line.strip())
file.close()


نوشتن در فایل – پایتون نویسنده می‌شه
برای نوشتن، با حالت "w" یا "a" فایل رو باز می‌کنی و از متد write() استفاده می‌کنی.


# نوشتن از صفر (همه چی قبلی پاک می‌شه)
file = open("notes.txt", "w", encoding="utf-8")
file.write("این اولین خطه.\n")
file.write("اینم دومین خط.\n")
file.write("دیگه بسه!\n")
file.close()


چند نکتهٔ خیلی مهم:

write() برخلاف print()، خودش آخر خط نمی‌ره. باید دستی \n (newline) رو بذاری تا خط بشکنه.

اگه از "w" استفاده کنی، فایل از نو ساخته می‌شه. پس مراقب اطلاعات قبلی باش.

اگه از "a" استفاده کنی، انگار داری یه برگه جدید ته دفتر می‌چسبونی:


# اضافه کردن بدون پاک کردن قبلی‌ها
file = open("notes.txt", "a", encoding="utf-8")
file.write("این یه خط اضافه‌ست!\n")
file.close()


نکتهٔ خفن: اگه فایلی که با "w" یا "a" باز می‌کنی وجود نداشته باشه، پایتون خودش می‌سازدش. نگران نباش، فقط حواست به مسیر باشه.

بستن فایل – در خروجی رو ببند، هوای سرد میاد!
تا اینجا هی نوشتیم file.close(). چرا اینقدر مهمه؟ چون وقتی فایل رو باز می‌کنی، سیستم‌عامل یه بخشی از منابع رو بهش اختصاص می‌ده. اگه نبندیش، ممکنه:

تغییرات کامل ذخیره نشن (داده از دست بره).

برنامه‌های دیگه نتونن به فایل دسترسی داشته باشن.

به مرور منابع سیستم کم بیاد.

اما خب، آدمیزاد فراموش‌کاره. مخصوصاً وقتی وسط کد یه خطا رخ بده و برنامه بپره بیرون، اون close() بیچاره هیچ‌وقت اجرا نمی‌شه. اینجاست که قهرمان داستان از راه می‌رسه: with.

استفاده از with – گاردین محافظ فایل‌ها
with یه بلاک جادویی می‌سازه که تا وقتی داخلشی، فایل بازه. به محض اینکه از بلاک خارج بشی (حتی با خطا)، پایتون خودش close() رو صدا می‌زنه. انگار یه محافظ شخصی برای فایل داری:


# روش مدرن و امن
with open("diary.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print(content)
# اینجا فایل به طور خودکار بسته می‌شه. نیاز به close() نداری.
print("فایل بسته شد، ما رفتیم!")


برای نوشتن هم:


lines = ["خط ۱", "خط ۲", "خط ۳"]
with open("output.txt", "w", encoding="utf-8") as f:
    for line in lines:
        f.write(line + "\n")
print("تموم شد و فایل خودبه‌خود بسته شد.")


از این به بعد، عادت کن همیشه با with کار کنی. کدت تمیزتر، امن‌تر و حرفه‌ای‌تر می‌شه. فقط قدیمی‌ها و کدهای آموزشی می‌نویسن open و close پشت سر هم؛ تو خفن باش، with رو بچسب.

یه سناریوی باحال: دفترچهٔ یادداشت هوشمند
بیایم همهٔ این تکنیک‌ها رو تو یه برنامهٔ واقعی بریزیم. یه دفترچهٔ یادداشت که می‌تونه خاطرات رو ذخیره کنه، نشون بده، و حتی جستجو کنه:


NOTES_FILE = "my_notes.txt"

def add_note(text):
    """یه یادداشت جدید به فایل اضافه می‌کنه."""
    with open(NOTES_FILE, "a", encoding="utf-8") as f:
        f.write(text + "\n")
    print("✅ یادداشت با موفقیت ذخیره شد.")

def show_all_notes():
    """همهٔ یادداشت‌ها رو نشون می‌ده."""
    try:
        with open(NOTES_FILE, "r", encoding="utf-8") as f:
            notes = f.readlines()
            if notes:
                print("📒 دفترچهٔ یادداشت:")
                for i, note in enumerate(notes, start=1):
                    print(f"  {i}. {note.strip()}")
            else:
                print("📭 دفترچه خالیه! یه چیزی بنویس.")
    except FileNotFoundError:
        print("📭 هنوز هیچ یادداشتی وجود نداره. اول یه چیزی بنویس!")

def search_notes(keyword):
    """تو یادداشت‌ها دنبال یه کلمه می‌گرده."""
    try:
        with open(NOTES_FILE, "r", encoding="utf-8") as f:
            found = False
            for line in f:
                if keyword in line:
                    print(f"🔍 پیدا شد: {line.strip()}")
                    found = True
            if not found:
                print(f"😕 خبری از '{keyword}' نیست.")
    except FileNotFoundError:
        print("📭 دفترچه وجود نداره!")

# یه تست ساده
while True:
    print("\n1. افزودن یادداشت\n2. نمایش همه\n3. جستجو\n4. خروج")
    choice = input("چه کار کنم؟ ")
    if choice == "1":
        note = input("یادداشتت رو بنویس: ")
        add_note(note)
    elif choice == "2":
        show_all_notes()
    elif choice == "3":
        key = input("دنبال چی بگردم؟ ")
        search_notes(key)
    elif choice == "4":
        print("خدانگهدار! یادداشت‌هات امن‌اند. 👋")
        break
    else:
        print("داداش یکی از ۱ تا ۴ رو بزن!")


اینجا از with، حالت "a" برای نوشتن، "r" برای خواندن، حلقهٔ مستقیم روی فایل، و مدیریت خطای FileNotFoundError استفاده کردیم. یه دفترچهٔ خاطرات واقعی و کاربردی!

چند نکتهٔ طلایی برای حرفه‌ای‌تر شدن
همیشه encoding="utf-8" رو بذار، خصوصاً وقتی با متن فارسی سروکار داری.

فایل‌ها می‌تونن پسوندهای مختلفی داشته باشن: .txt, .csv, .json, .log و... روش کار باهاشون یکیه.

اگه از "w" استفاده می‌کنی و فایل مهمی داری، یه لحظه مکث کن. شاید بهتره با "a" اضافه کنی.

برای فایل‌های خیلی بزرگ، از read() استفاده نکن چون کل فایل رو می‌ریزه تو RAM و ممکنه برنامه رو قفل کنه. حلقهٔ مستقیم یا readline() بهترینه.

اگه نیاز داری هم بخونی هم بنویسی، حالت‌های "r+", "w+", "a+" رو بعداً یاد بگیر.

جمع‌بندی: فایل‌ها دوستای همیشگین
کار با فایل‌ها یه مهارت جدایی‌ناپذیر از برنامه‌نویسی واقعیه. پایتون با open() ساده، حالت‌های r, w, a، و متدهای خواندن و نوشتن، این کار رو به یه تجربهٔ لذت‌بخش تبدیل کرده. اما قشنگ‌ترین بخشش، with هست که خیالت رو از بابت بستن فایل راحت می‌کنه.

یادت باشه: فایل‌ها حافظهٔ برنامه‌هات هستن. هر وقت خواستی داده‌ای رو برای همیشه نگه داری، درِ یه فایل رو باز کن و باهاش حرف بزن. حالا که دفتر و خودکار آماده‌ست، برو و اولین داستان کدنویسی خودت رو بنویس! 📁🐍✨