کار با فایلها
در این درس با open و with فایل میسازید و میخوانید، حالتهای r و w و a را از هم تشخیص میدهید و نبودن فایل را با try و except مدیریت میکنید.
آنچه در این درس میآموزید
- با open و with در فایل بنویسید و از آن بخوانید
- حالتهای r و w و a را بهجا انتخاب کنید
- نبودن فایل را با try و except مدیریت کنید و فایل را حذف کنید
فهرست مطالب
همهٔ دادههایی که تا اینجا ساختید در حافظه بودند؛ با بستن برنامه میمیرند. برنامههای واقعی باید داده را ماندگار کنند: تنظیمات، نمرهها، گزارشها. فایل سادهترین شکل ماندگاری است و پایتون برای خواندن و نوشتن آن فقط یک تابع اصلی دارد: open.
در این درس فایل میسازید و مینویسید، به سه روش مختلف میخوانید، حالتهای باز کردن را از هم جدا میکنید و نبودن فایل را با ابزار درس قبل مهار میکنید. مثالهای این درس روی یک فایل آزمایشی به نام note.txt در همان پوشه کار میکنند.
نوشتن در فایل
with open("note.txt", "w", encoding="utf-8") as f:
f.write("Hello from Python!\n")
f.write("This is a test note.\n")
print("Writing finished")Writing finished
تابع open سه چیز میگیرد: نام فایل، حالت باز کردن و انکودینگ. حالت "w" یعنی نوشتن (Write)؛ اگر فایل نباشد میسازد. دستور with بلوکی باز میکند که در پایان آن، فایل خودکار بسته میشود؛ این الگوی استاندارد است و فراموش کردن close() را ناممکن میکند. متد write متن مینویسد و خودش Enter نمیگذارد؛ پس \n را دستی میگذاریم.
خواندن کل فایل
with open("note.txt", encoding="utf-8") as f:
content = f.read()
print(content)Hello from Python! This is a test note.
حالت خواندن "r" پیشفرض open است و نیازی به نوشتنش نیست. متد read کل متن را یکجا به شکل رشته میدهد؛ برای فایلهای کوچک راحتترین راه است.
خواندن خطبهخط
شیء فایل مستقیماً قابل پیمایش است؛ هر دور حلقه یک خط:
with open("note.txt", encoding="utf-8") as f:
for line in f:
print(line.strip())Hello from Python! This is a test note.
هر خط با \n میآید و strip از درس رشتهها آن را میتراشد. این روش برای فایلهای بزرگ حافظهدوست است چون همیشه فقط یک خط در کار است. اگر بهجای پیمایش، همهٔ خطها را یکجا در لیست میخواهید، متد readlines همین کار را میکند.
حالتهای باز کردن
| حالت | معنا | رفتار با محتوای قبلی |
|---|---|---|
r |
خواندن | فایل باید از قبل باشد |
w |
نوشتن | بیدرنگ پاک میشود |
a |
افزودن | حفظ میشود و نوشتن به انتها میرود |
وقتی فایل وجود ندارد
خواندن فایلی که نیست، استثنا میدهد؛ و ابزار مهارش را در درس قبل ساختید:
try:
with open("missing.txt", encoding="utf-8") as f:
print(f.read())
except FileNotFoundError:
print("File not found")File not found
FileNotFoundError از استثناهای پرتکرار کار با فایل است؛ گرفتن آن بهجای اجازهٔ فروپاشی، به شما اجازه میدهد فایل تازه بسازید یا پیام مناسبی بدهید.
حذف فایل
پاک کردن فایل هم کار روزمره است؛ ماژول os که در درس بعد با خانوادهاش آشنا میشوید، آن را فراهم میکند:
import os
os.remove("note.txt")
print("File removed")File removed
تمرینها
تمرین
تمرین ۱ — شمارش خطها
برنامهای بنویسید که سه خط در فایل result.txt بنویسد، سپس آن را با readlines بخواند و تعداد خطها را چاپ کند. در پایان، فایل آزمایشی را با os.remove پاک کنید تا چیزی به جا نماند.
# Write your code hereنمایش راهحل
with open("result.txt", "w", encoding="utf-8") as f:
f.write("one\n")
f.write("two\n")
f.write("three\n")
with open("result.txt", encoding="utf-8") as f:
lines = f.readlines()
print(len(lines))
import os
os.remove("result.txt")3
::: :::
خلاصه
openشیء فایل میدهد وwithآن را در پایان بلوک خودکار میبندد.- حالت
wمینویسد و محتوای قبلی را پاک میکند؛aبه انتها میافزاید؛r(پیشفرض) میخواند. readکل متن را میدهد؛ پیمایش شیء فایل خطبهخط میرود وreadlinesلیست خطها میدهد.- نبودن فایل خطای FileNotFoundError میدهد و با
tryوexceptمهار میشود. encoding="utf-8"را همیشه صریح بنویسید تا متن فارسی سالم بماند.
تمام کدهای این دوره تا حالا در تکفایل بود؛ برنامههای واقعی چندفایلیاند. در درس بعدی کد را با ماژولها و پکیجها سازمان میدهیم و از کتابخانهٔ استاندارد پایتون بهره میگیریم.