Table of Contents
مثالمحور فکر کنید
در این بخش میخواهیم چند برنامهٔ کامل و کوچک بنویسیم که با فایل کار میکنند. فرض میکنیم قبلاً با مفاهیم کلی مثل «فایل چیست»، «خواندن و نوشتن فایل متنی» و «مسیر فایلها» آشنا شدهاید. اینجا تمرکز روی این است که:
- چند ایدهٔ سادهٔ واقعی ببینید
- ورودی/خروجی کاربر، حلقه و شرط را با کار با فایل ترکیب کنید
- شکلِ «یک برنامهٔ واقعی» را حس کنید
همهٔ مثالها را میتوانید در یک فایل مثل app.py ذخیره و اجرا کنید.
برنامه ۱: ذخیره و خواندن یادداشتهای متنی ساده
هدف: ساخت یک «دفترچهٔ یادداشت» خیلی ساده که بتوانیم یادداشت بنویسیم و بعداً آنها را ببینیم.
فایل: notes.txt
# برنامهٔ سادهٔ یادداشتها
def show_menu():
print("1) افزودن یادداشت جدید")
print("2) نمایش همهٔ یادداشتها")
print("3) خروج")
while True:
show_menu()
choice = input("یک گزینه را انتخاب کنید: ")
if choice == "1":
note = input("متن یادداشت را وارد کنید: ")
# 'a' یعنی افزودن به انتهای فایل (پاک نمیکند)
with open("notes.txt", "a", encoding="utf-8") as f:
f.write(note + "\n")
print("یادداشت ذخیره شد.\n")
elif choice == "2":
try:
with open("notes.txt", "r", encoding="utf-8") as f:
content = f.read()
if content.strip() == "":
print("هنوز یادداشتی ثبت نشده است.\n")
else:
print("یادداشتها:")
print(content)
except FileNotFoundError:
print("فایل یادداشت هنوز وجود ندارد. ابتدا یادداشت اضافه کنید.\n")
elif choice == "3":
print("خدانگهدار!")
break
else:
print("گزینهٔ نامعتبر. دوباره تلاش کنید.\n")نکات مهمِ این برنامه:
- استفاده از
with open(..., "a")برای افزودن یادداشتها، بدون پاککردن قبلی - استفاده از
try / except FileNotFoundErrorبرای حالتی که هنوز فایلی ساخته نشده - ترکیب یک منوی ساده با حلقهٔ بینهایت و شرطها
برنامه ۲: شمارش تعداد خطوط، کلمات و کاراکترها در یک فایل
این برنامه یک فایل متنی میگیرد و یک آمار ساده از آن میدهد. این ایده، پایهٔ خیلی از ابزارهای تحلیلی است.
# برنامهٔ شمارش خطوط، کلمات و کاراکترها
file_name = input("نام فایل متنی را وارد کنید: ")
try:
with open(file_name, "r", encoding="utf-8") as f:
text = f.read()
line_count = text.count("\n") + (1 if text else 0)
# جدا کردن متن بر اساس فاصله برای شمارش کلمات (خیلی ساده و ابتدایی)
words = text.split()
word_count = len(words)
char_count = len(text)
print("تعداد خطوط:", line_count)
print("تعداد کلمات:", word_count)
print("تعداد کاراکترها:", char_count)
except FileNotFoundError:
print("فایل پیدا نشد. مطمئن شوید نام فایل را درست وارد کردهاید.")نکات مهم:
- گرفتن نام فایل از کاربر
- استفاده از روشهای سادهٔ رشتهها (
split,len,count) - مدیریت خطای «فایل وجود ندارد»
برنامه ۳: دفترچهٔ تلفن بسیار ساده (روی فایل متنی)
در این نسخهٔ خیلی ساده، هر خط یک «نام - شماره» است.
فایل: contacts.txt
# دفترچهٔ تلفن ساده
FILE_NAME = "contacts.txt"
def show_menu():
print("1) افزودن مخاطب")
print("2) جستجوی مخاطب")
print("3) نمایش همهٔ مخاطبین")
print("4) خروج")
def add_contact():
name = input("نام مخاطب: ")
phone = input("شمارهٔ تلفن: ")
line = name + " - " + phone
with open(FILE_NAME, "a", encoding="utf-8") as f:
f.write(line + "\n")
print("مخاطب ذخیره شد.\n")
def search_contact():
keyword = input("نام یا بخشی از نام را وارد کنید: ")
try:
with open(FILE_NAME, "r", encoding="utf-8") as f:
lines = f.readlines()
except FileNotFoundError:
print("هنوز مخاطبی ذخیره نشده است.\n")
return
found = False
for line in lines:
if keyword.lower() in line.lower():
print(line.strip())
found = True
if not found:
print("مخاطب مورد نظر پیدا نشد.\n")
else:
print()
def show_all():
try:
with open(FILE_NAME, "r", encoding="utf-8") as f:
content = f.read()
if content.strip() == "":
print("هنوز مخاطبی ذخیره نشده است.\n")
else:
print("همهٔ مخاطبین:")
print(content)
except FileNotFoundError:
print("هنوز مخاطبی ذخیره نشده است.\n")
while True:
show_menu()
choice = input("یک گزینه را انتخاب کنید: ")
if choice == "1":
add_contact()
elif choice == "2":
search_contact()
elif choice == "3":
show_all()
elif choice == "4":
print("خدانگهدار!")
break
else:
print("گزینهٔ نامعتبر.\n")نکات مهم:
- جداسازی منطق برنامه به «توابع» برای خوانایی
- استفاده از یک فایل عمومی
FILE_NAMEدر بالای برنامه - جستجوی ساده با
inروی رشتهها
برنامه ۴: کپیبرداری ساده از یک فایل متنی
ایده: یک فایل متنی را بخوانیم و در فایل دیگری بنویسیم (نسخهٔ پشتیبان ساده).
# برنامهٔ کپیبرداری از فایل متنی
source = input("نام فایل منبع: ")
target = input("نام فایل مقصد (مثلاً backup.txt): ")
try:
with open(source, "r", encoding="utf-8") as f_src:
content = f_src.read()
with open(target, "w", encoding="utf-8") as f_dst:
f_dst.write(content)
print("کپی با موفقیت انجام شد.")
except FileNotFoundError:
print("فایل منبع پیدا نشد.")ایدههای گسترش:
- قبل از نوشتن روی فایل مقصد، پرسیدنِ تأیید از کاربر
- اضافهکردن تاریخ/زمان به نام فایل مقصد (نیاز به آشنایی با
datetime)
برنامه ۵: لیست کارها (To-Do) متنی
هر کار در یک خط ذخیره میشود. یک منوی خیلی ساده داریم:
فایل: todos.txt
# لیست کارهای خیلی ساده
FILE_NAME = "todos.txt"
def show_menu():
print("1) افزودن کار جدید")
print("2) نمایش همهٔ کارها")
print("3) حذف همهٔ کارها")
print("4) خروج")
def add_task():
task = input("شرح کار: ")
with open(FILE_NAME, "a", encoding="utf-8") as f:
f.write(task + "\n")
print("کار اضافه شد.\n")
def show_tasks():
try:
with open(FILE_NAME, "r", encoding="utf-8") as f:
lines = f.readlines()
except FileNotFoundError:
print("هیچ کاری ثبت نشده است.\n")
return
if not lines:
print("هیچ کاری ثبت نشده است.\n")
else:
print("فهرست کارها:")
for i, line in enumerate(lines, start=1):
print(f"{i}. {line.strip()}")
print()
def clear_tasks():
confirm = input("آیا مطمئن هستید که همهٔ کارها حذف شوند؟ (y/n): ")
if confirm.lower() == "y":
# خالیکردن فایل با حالت 'w'
with open(FILE_NAME, "w", encoding="utf-8"):
pass
print("همهٔ کارها حذف شد.\n")
else:
print("حذف لغو شد.\n")
while True:
show_menu()
choice = input("یک گزینه را انتخاب کنید: ")
if choice == "1":
add_task()
elif choice == "2":
show_tasks()
elif choice == "3":
clear_tasks()
elif choice == "4":
print("خدانگهدار!")
break
else:
print("گزینهٔ نامعتبر.\n")ایدههای بعدی برای گسترش همین برنامه (برای تمرین شخصی):
- اضافهکردن وضعیت «انجام شد / انجام نشده» برای هر کار
- امکان حذف یک کار مشخص با شماره
- ذخیرهٔ زمان ایجاد هر کار (نیاز به ماژول
datetime)
الگوهای رایج در برنامههای مبتنی بر فایل
در مثالها، چند «الگوی تکراری» میبینید که در اکثر برنامههای سادهٔ مبتنی بر فایل وجود دارند:
- گرفتن نام فایل یا ورودی کاربر
- با
input()و تبدیل/بررسیِ مقدارهای ورودی - استفاده از
with open(...):برای خواندن یا نوشتن - تقریبا همیشه این شکل را میبینید:
with open("file.txt", "r", encoding="utf-8") as f:
data = f.read()یا:
with open("file.txt", "a", encoding="utf-8") as f:
f.write("something\n")- کار با دادهٔ خواندهشده مثل یک رشته یا لیست
- جداکردن به خطها با
readlines()یاsplitlines() - جداکردن به کلمات با
split() - شمارش با
len() - مدیریت خطاهای متداول (بهخصوص
FileNotFoundError) - اگر فایل هنوز ساخته نشده یا نام اشتباه است
ترکیب همین الگوهای ساده به شما امکان میدهد انواع برنامههای کوچک را بسازید: دفترچه، دفتر تلفن، لیست خرید، لاگ فعالیتها، ذخیرهٔ امتیاز بازی و غیره.
تمرین پیشنهادی
برای تمرین و تثبیت:
- یکی از برنامههای بالا را انتخاب کنید و:
- پیامها و متنها را به سلیقهٔ خودتان عوض کنید
- نام فایل را تغییر دهید
- یک گزینهٔ جدید به منو اضافه کنید
- خودتان یک برنامهٔ جدید تعریف کنید که:
- اطلاعاتی را از کاربر بگیرد
- آنها را در فایل ذخیره کند
- بعداً بتوانید آنها را ببینید یا جستجو کنید
برای شروع، برنامهای مثل «ثبت نمرههای دانشآموزان» یا «ثبت مخارج روزانه» ایدههای خیلی خوبی هستند.