فصل ۷ · ادامهٔ مسیر

خواندن فایل‌های متنی

فایل را خط‌به‌خط بخوان، خطوط دلخواه را انتخاب کن و خطاهای مسیر را مدیریت کن.

۴۰ دقیقهٔ پیشنهادی مطالعه و تمرین۵ بخشتمرین عملی و خودآزمایی

بعد از این فصل می‌توانی…

  • فایل متنی را با open باز کنی.
  • خط‌ها را بشماری و فیلتر کنی.
  • FileNotFoundError را مدیریت کنی.

پیشنهاد برای پیش‌نیاز: رشته‌ها و پردازش متن

ویدیوی این فصل

خواندن فایل‌های متنی

ویدیوی این فصل هنوز اضافه نشده است. می‌توانی همین حالا آموزش متنی و تمرین‌ها را شروع کنی.

بخش 1

فایل و حافظهٔ موقت

متغیرها هنگام اجرای برنامه در حافظه‌اند. فایل برای نگهداری داده استفاده می‌شود. فایل متنی را می‌توان دنباله‌ای از خط‌ها در نظر گرفت؛ معمولاً پایان هر خط با نویسهٔ \n مشخص می‌شود.

در این درس فایل messages.txt از قبل در فضای مجازی کارگاه آماده است. این فضا فایل‌های کامپیوتر تو نیست و در اجرای تازه دوباره از نمونهٔ درس ساخته می‌شود. در پایتون نصب‌شده، مسیر فایل باید روی همان دستگاه وجود داشته باشد.

بخش 2

باز کردن و بستن فایل

open نام فایل، حالت و encoding را می‌گیرد و شیء فایل برمی‌گرداند. حالت r برای خواندن است. with پس از تمام شدن بلوک فایل را می‌بندد؛ این روش از جا ماندن فایل باز جلوگیری می‌کند.

حالت w برای نوشتن است و محتوای قبلی فایل را پاک می‌کند؛ برای تمرین خواندن از r استفاده کن. encoding="utf-8" برای فایل‌های UTF-8 شامل متن فارسی مناسب است.

خواندن همهٔ متن

with open("messages.txt", "r", encoding="utf-8") as handle:
    text = handle.read()
print(text.splitlines()[0])
خروجی مورد انتظار
From: sara@example.org
بخش 3

پیمایش و شمارش خط‌ها

حلقهٔ for روی فایل هر بار یک خط را می‌دهد. شمارنده را پیش از حلقه صفر کن و در هر دور یک واحد زیاد کن. خط خالی هم یک خط محسوب می‌شود.

read() تمام محتوای باقی‌مانده را یکجا می‌خواند؛ برای فایل بزرگ، پیمایش خط‌به‌خط حافظهٔ کمتری نیاز دارد. پس از رسیدن به انتها، برای خواندن دوباره می‌توان فایل را دوباره باز کرد.

تعداد خط‌ها

count = 0
with open("messages.txt", encoding="utf-8") as handle:
    for line in handle:
        count += 1
print(count)
خروجی مورد انتظار
6
بخش 4

فیلتر و مسئلهٔ خط خالی اضافه

خط خوانده‌شده معمولاً \n دارد و print هم یک پایان خط اضافه می‌کند. rstrip() فاصله‌های انتهایی را حذف می‌کند؛ rstrip("\n") فقط پایان خط را حذف می‌کند.

با startswith خط‌های دارای پیشوند دلخواه را انتخاب کن. با in می‌توان بخشی از متن را در هر جای خط جست‌وجو کرد و با continue خط‌های نامناسب را کنار گذاشت.

انتخاب فرستنده‌ها

with open("messages.txt", encoding="utf-8") as handle:
    for line in handle:
        if not line.startswith("From:"):
            continue
        print(line.rstrip("\n"))
خروجی مورد انتظار
From: sara@example.org
From: ali@example.org
بخش 5

فایل پیدا نشد

اگر نام یا مسیر اشتباه باشد، open خطای FileNotFoundError می‌دهد. می‌توان نام فایل را از input گرفت و این خطا را با try / except مدیریت کرد.

پیام قابل فهم برای مسیر اشتباه

try:
    with open("missing.txt", encoding="utf-8") as handle:
        print(handle.read())
except FileNotFoundError:
    print("فایل پیدا نشد")
خروجی مورد انتظار
فایل پیدا نشد
حالا نوبت توست

تعداد موضوع‌ها

فایل messages.txt را بخوان و فقط خط‌هایی را بشمار که با Subject: شروع می‌شوند. نتیجه باید ۲ باشد.

یک راهنمای کوچک

درون حلقه از line.startswith("Subject:") استفاده کن.

پاسخ پیشنهادی و خروجی
count = 0
with open("messages.txt", encoding="utf-8") as handle:
    for line in handle:
        if line.startswith("Subject:"):
            count += 1
print(count)

خروجی نمونه

2

خودآزمایی

پاسخ را انتخاب کن و دلیل آن را بخوان. این بخش برای تمرین است و نمرهٔ رسمی ثبت نمی‌کند.

1. حالت r در open برای چیست؟
2. چرا print(line) گاهی یک خط خالی اضافه می‌سازد؟