Table of Contents
چرا کار با فایلها مهم است؟
تا اینجا بیشترِ برنامههایی که نوشتید فقط با ورودیِ کاربر و خروجیِ روی صفحه کار میکردند. این برنامهها بعد از بسته شدن، «چیزی به یاد نمیآورند».
کار با فایلها به برنامهٔ شما این توانایی را میدهد که دادهها را ذخیره کند و بعداً دوباره از آنها استفاده کند؛ مثل:
- ذخیرهٔ نتایج یک آزمون
- نگه داشتن فهرست کارها (To-Do List)
- ذخیرهٔ گزارشِ اجرای برنامه (Log)
- خواندن تنظیمات برنامه از یک فایل
در این فصل بهصورت مقدماتی یاد میگیرید چطور در پایتون:
- یک فایل متنی را باز کنید
- از آن بخوانید یا در آن بنویسید
- در نهایت فایل را ببندید
مباحث جزئیتر در زیرعنوانهای این فصل (مثل خواندن، نوشتن و مسیر فایلها) جداگانه توضیح داده خواهند شد. اینجا روی «الگوی کلی کار با فایل» تمرکز میکنیم.
مفهوم کلی فایل در پایتون
برای اینکه پایتون بتواند با یک فایل کار کند، باید:
- فایل را «باز» کند (open)
- روی آن عملی انجام دهد (خواندن یا نوشتن)
- آن را «ببندد» (close)
در پایتون این کار با تابع open() انجام میشود که یک «شیء فایل» به شما برمیگرداند. با این شیء میتوانید بخوانید، بنویسید و در پایان آن را ببندید.
الگوی کلی:
file_object = open("نام_فایل", "حالت")
# انجام عملیات روی فایل
file_object.close()"نام_فایل"یک رشته است، مثل"data.txt""حالت"(mode) مشخص میکند که میخواهید بخوانید، بنویسید یا اضافه کنید
حالتهای مرسوم باز کردن فایل
چند حالت (mode) پرکاربرد:
"r": خواندن (read)"w": نوشتن (write) – اگر فایل وجود داشته باشد، محتوا را پاک و از اول مینویسد"a": افزودن (append) – محتوا را پاک نمیکند، از انتهای فایل ادامه میدهد"r+": خواندن و نوشتن همزمان روی همان فایل
در همهٔ این حالتها، اگر فقط "r", "w", "a" بنویسید، فایل بهصورت متنی (text) باز میشود که برای این فصل کافی است.
نمونه: باز کردن یک فایل برای خواندن
f = open("notes.txt", "r") # باز کردن برای خواندن
text = f.read() # خواندن کل محتوا
print(text)
f.close() # بستن فایل
در فصل «خواندن فایلهای متنی» روشهای مختلف read() و خواندن خطبهخط توضیح داده میشود.
نمونه: باز کردن یک فایل برای نوشتن
f = open("output.txt", "w") # باز کردن برای نوشتن
f.write("سلام دنیا!\n") # نوشتن در فایل
f.close() # بستن فایل
در فصل «نوشتن و افزودن به فایلها» به تفاوت "w" و "a" و جزئیات write() بیشتر پرداخته میشود.
چرا بستن فایل مهم است؟
وقتی کارتان با یک فایل تمام شد، باید آن را ببندید:
- سیستمعامل منابعی (مثل حافظه و «دستهٔ فایل») به فایل اختصاص میدهد
- اگر نبندید، ممکن است دادهها کامل نوشته نشوند
- در برنامههای بزرگ بسته نشدن فایلها میتواند مشکلساز شود
تابع close() برای همین است:
f = open("data.txt", "r")
# کار با فایل
f.close()
البته در پایتون یک راه بهتر و امنتر وجود دارد: استفاده از with.
استفاده از with برای مدیریت خودکار فایل
الگوی رایج و توصیهشده برای کار با فایل در پایتون استفاده از عبارت with است. این روش باعث میشود بعد از اتمام بلوک with، فایل بهطور خودکار بسته شود، حتی اگر خطایی در میانهٔ کار رخ دهد.
الگوی کلی:
with open("نام_فایل", "حالت") as f:
# کار با فایل از طریق f
...
# اینجا فایل خودبهخود بسته شده استمثال خواندن:
with open("notes.txt", "r") as f:
content = f.read()
print(content)
# در این نقطه، f بسته شده استمثال نوشتن:
with open("log.txt", "a") as log_file:
log_file.write("برنامه اجرا شد.\n")
مزیتهای with:
- نیازی نیست
close()را دستی صدا بزنید - کد خواناتر و مرتبتر است
- در برابر خطاها امنتر است (اگر وسط کار خطایی بیفتد، باز هم فایل بسته میشود)
حالت متنی در برابر حالت باینری (نگاه خیلی کلی)
فایلها را میتوان بهصورت:
- متنی (text) – مثل
.txt، بسیاری از فایلهای سادهٔ تنظیمات - باینری (binary) – مثل تصاویر، ویدیوها، برخی فرمتهای خاص
پایتون برای حالت باینری از b در mode استفاده میکند، مثل "rb" یا "wb".
در این دوره، در فصل فعلی فقط با فایلهای متنی سر و کار داریم و حالت باینری در سطح مقدماتی فقط معرفی میشود:
"rb": خواندن باینری"wb": نوشتن باینری
مثلاً برای خواندن یک تصویر:
with open("image.png", "rb") as img:
data = img.read()
در پروژههای سادهٔ این دوره، معمولاً همان حالت متنی ("r", "w", "a") کافی است.
نکتههایی دربارهٔ نام و محل فایلها
جزئیات کامل مسیر فایلها در بخش «مسیر فایلها» میآید؛ اینجا فقط چند نکتهٔ عملی:
- اگر فقط نام فایل را بنویسید مثل
"data.txt"، پایتون آن را در «پوشهٔ فعلی برنامه» جستجو میکند. - میتوانید از مسیرهای نسبی استفاده کنید، مثل
"files/data.txt". - در رشتههای مسیر، بکاسلش
\در ویندوز میتواند دردسرساز شود؛ یکی از راهحلها استفاده از/یا رشتهٔ خام مثلr"C:\folder\data.txt"است.
مثال ساده:
with open("files/todo.txt", "r") as f:
print(f.read())الگوی کلی برنامههای مبتنی بر فایل
بسیاری از برنامههایی که با دادهٔ پایدار سروکار دارند، از الگوی زیر پیروی میکنند:
- باز کردن فایل و خواندن دادهٔ قبلی (اگر وجود دارد)
- پردازش داده (با استفاده از مفاهیمی که قبلاً یاد گرفتهاید: متغیرها، لیستها، شرطها، حلقهها و...)
- باز کردن (یا ساختن) یک فایل و نوشتن دادهٔ جدید یا بهروزشده
- بستن فایل (یا سپردن آن به
with)
برای مثال، یک برنامهٔ بسیار سادهٔ ثبت نمرهٔ دانشآموزان میتواند:
- هنگام شروع اجرا، نمرههای قبلی را از یک فایل بخواند
- از کاربر نمرههای جدید بگیرد
- در پایان، فهرست کامل نمرهها را در همان فایل ذخیره کند
در بخش «برنامههای ساده مبتنی بر فایل» نمونههای مشخصتری از این الگو خواهید دید.
نکات مقدماتی برای جلوگیری از خطا
وقتی شروع به کار با فایلها میکنید، چند خطای متداول ممکن است رخ دهد:
- نام فایل اشتباه: مثلاً در دیسک
data.txtدارید ولی در کد نوشتهاید"date.txt" - فایل وجود ندارد ولی با
"r"باز میکنید → خطایFileNotFoundError - نداشتن مجوز نوشتن در یک پوشه (در برخی سیستمها)
برای شروع:
- مطمئن شوید فایل در همان پوشهای است که اسکریپت شما اجرا میشود (یا مسیر را درست بدهید).
- اگر قرار است فایل جدید ساخته شود، از
"w"یا"a"استفاده کنید. - برای برنامههای جدیتر میتوان از
tryوexcept(فصل خطاها) استفاده کرد تا خطاهای مربوط به فایل را مدیریت کنید.
در ادامهٔ این فصل، در زیرعنوانهای مجزا، روشهای دقیق خواندن، نوشتن، کار با مسیرها و نوشتن برنامههای سادهٔ مبتنی بر فایل را مرحلهبهمرحله تمرین خواهید کرد.