متدهای فایل در پایتون، خواندن فایل در پایتون و دادن مسیر فایل

اکثر خطاهایی که برنامهنویسان تازهکار هنگام کار با فایل در پایتون میگیرند، ربطی به منطق برنامه ندارد؛ ریشهشان یا در مسیر اشتباه فایل است یا در انتخاب نادرست متد خواندن. این راهنما دقیقاً همین دو نقطه را باز میکند: چطور فایل را درست باز و بخوانیم، چطور مسیرش را طوری بدهیم که روی سیستمعاملهای مختلف هم کار کند، و چه مشکلاتی هستند که معمولاً کسی از قبل هشدارشان را نمیدهد.
پیشنیازها
نصب بودن پایتون ۳ روی سیستم
داشتن یک فایل متنی نمونه مانند data.txt
آشنایی مقدماتی با اجرای برنامه پایتون
باز کردن فایل با تابع open
برای باز کردن فایل از تابع open استفاده میکنیم. این تابع فایل را باز میکند و یک شیء فایل در اختیار برنامه قرار میدهد. سپس میتوانیم محتوای فایل را بخوانیم یا در آن بنویسیم.

در این کد، data.txt نام فایل است. مقدار r یعنی فایل فقط برای خواندن باز شود. گزینه8 utf-نیز کمک میکند متن فارسی بهدرستی نمایش داده شود.
حالتهای مهم باز کردن فایل
| حالت | کاربرد |
| r | خواندن فایل؛ حالت پیشفرض |
| w | نوشتن در فایل؛ محتوای قبلی پاک میشود |
| a | اضافه کردن متن به انتهای فایل |
| r+ | خواندن و نوشتن همزمان |
| rb | خواندن فایل باینری مانند تصویر یا PDF |
نکته مهم: برای فایلهایی که متن فارسی دارند، همیشه 8encoding=utf- را بنویسید. در غیر این صورت ممکن است حروف فارسی ناخوانا شوند.
چرا بهتر است از with استفاده کنیم؟
فایلی که باز میشود باید پس از پایان کار بسته شود. روش with این کار را خودکار انجام میدهد. حتی اگر هنگام اجرای برنامه خطایی رخ دهد، فایل بهدرستی بسته خواهد شد.

پس از تمام شدن بلوک with، فایل خودکار بسته میشود و دیگر نیازی به نوشتن () f.close نیست. برای بیشتر برنامهها همین روش بهترین انتخاب است.
مطلب پرطرفدار سایت: ماژول در پایتون چیست؟ تفاوت ماژول و تابع + ۱۲ نکته مهم
تفاوت read، readline و readlines
()read: تمام محتوای فایل را یکجا و بهشکل یک رشته میخواند. برای فایلهای کوچک مناسب است.
()readline: فقط یک خط را در هر بار اجرا میخواند.
()readlines: تمام خطها را میخواند و آنها را داخل یک فهرست قرار میدهد.

در readlines هر خط یک عضو از فهرست است. معمولاً علامت رفتن به خط بعد نیز در انتهای هر عضو باقی میماند.
روش بهتر برای خواندن خطبهخط
برای فایلهای بزرگ بهتر است مستقیماً روی شیء فایل حلقه بزنیم. در این حالت همه فایل یکجا وارد حافظه نمیشود.

متد strip فاصلهها و علامت رفتن به خط بعد را از ابتدا و انتهای هر خط حذف میکند.
نوشتن مسیر فایل به شکل صحیح
اگر فقط نام فایل را بنویسید، پایتون آن را در پوشه کاری فعلی جستوجو میکند. این پوشه همیشه همان پوشهای نیست که فایل برنامه پایتون در آن ذخیره شده است.
برای دیدن پوشه کاری فعلی از کد زیر استفاده کنید:

مسیر فایل در ویندوز
در مسیرهای ویندوز از بکاسلش استفاده میشود. برای جلوگیری از تفسیر اشتباه بکاسلشها، حرف r را قبل از رشته قرار دهید.

روش پیشنهادی: استفاده از pathlib
ماژول pathlib ساخت مسیر را سادهتر میکند و کد روی ویندوز، لینوکس و macOS بهتر اجرا میشود. همچنین میتوان وجود فایل را بهسادگی بررسی کرد.

علامت / در pathlib پوشهها و نام فایل را به هم متصل میکند. خود پایتون جداکننده مناسب سیستمعامل را انتخاب میکند.
رفع خطای FileNotFoundError
این خطا یعنی پایتون فایل را در مسیر دادهشده پیدا نکرده است. سه دلیل رایج دارد:
1. پوشه کاری اشتباه است: ممکن است برنامه از پوشه دیگری اجرا شده باشد. بهتر است مسیر را نسبت به محل فایل پایتون بسازید.

2. نام فایل اشتباه نوشته شده است: نام، پسوند و بزرگی یا کوچکی حروف را بررسی کنید. در لینوکس Data.txt و data.txt دو فایل متفاوت هستند.
3. فایل هنوز ساخته نشده است: قبل از خواندن فایل، وجود آن را بررسی کنید تا پیام واضحتری نمایش داده شود.

خطای PermissionError نیز معمولاً زمانی دیده میشود که اجازه دسترسی به فایل ندارید یا برنامه دیگری فایل را قفل کرده است.
خواندن فایلهای بزرگ بدون پر شدن حافظه
برای فایلهای متنی بزرگ از حلقه for و خواندن خطبهخط استفاده کنید. برای فایلهای باینری بزرگ میتوان هر بار بخش کوچکی از فایل را خواند.

در این روش فقط یک بخش کوچک از فایل در حافظه قرار میگیرد. این الگو برای فایلهای حجیم، لاگها، دادهها و فایلهای رسانهای مناسب است.
چند نکته تکمیلی
با () f.tell میتوانید محل فعلی نشانگر خواندن فایل را ببینید.
با f.seek(n) میتوانید نشانگر خواندن را به محل دیگری از فایل ببرید.
در حالت r+ امکان خواندن و نوشتن وجود دارد، اما نوشتن در وسط فایل میتواند محتوای قبلی را جایگزین کند.
برای پروژههای جدید، pathlib معمولاً خواناتر از os.path است.
اگر انکودینگ فایل را نمیدانید، ممکن است هنگام خواندن با خطای UnicodeDecodeError روبهرو شوید.
این صددرصد به کارت میاد: آموزش هوش مصنوعی با پایتون؛ صفر تا صد رایگان و پروژهمحور
چرا گاهی فایل باز میشود اما محتوایش خالی یا ناقص است؟
این اتفاق معمولاً وقتی رخ میدهد که برنامه یا فرایند دیگری هنوز در حال نوشتن روی همان فایل است و شما همزمان آن را باز کردهاید؛ نتیجه یک فایل نیمهنوشته است که نه خطا میدهد و نه محتوای کامل. این حالت بیشتر در فایلهایی دیده میشود که از یک منبع خارجی میآیند، مثل فایل آپلودی کاربر، خروجی یک اسکریپت دانلود، یا گزارشی که یک سرویس دیگر همان لحظه دارد آن را میسازد.
راهحل ساده و عملی این است که پیش از خواندن، اندازه فایل را با فاصله چند ثانیه دو بار بررسی کنید؛ اگر اندازه بین این دو بار ثابت مانده بود، فایل احتمالاً کامل شده و آماده خواندن است. این ترفند در برنامههایی که فایل را از منبعی بیرون از کنترل مستقیم خودشان میگیرند، از بروز خطاهای مبهم و دیرفهم جلوگیری میکند.
چرا بهتر است پیش از بازنویسی یک فایل مهم، از آن نسخه پشتیبان بگیریم؟
هر بار که برنامهای بهطور خودکار محتوای یک فایل را بازنویسی میکند، این ریسک وجود دارد که بهخاطر یک باگ کوچک یا یک خطای پیشبینینشده، داده اصلی برای همیشه از بین برود؛ برخلاف ویرایش دستی در یک نرمافزار، اینجا هیچ گزینه بازگشتی در کار نیست.
عادت سادهای که این ریسک را تقریباً از بین میبرد، این است که پیش از هر بازنویسی، یک کپی از فایل اصلی با نام یا تاریخ متفاوت نگه داشته شود. این نکته بهخصوص در اسکریپتهایی که بدون نظارت انسانی و بهصورت زمانبندیشده اجرا میشوند اهمیت دارد، چون اگر مشکلی پیش بیاید، معمولاً کسی همان لحظه متوجه نمیشود و تنها نسخه پشتیبان است که جلوی از دست رفتن داده را میگیرد.

چرا افزودن همزمان چند برنامه به یک فایل لاگ میتواند محتوا را بههم بریزد؟
وقتی چند نمونه از یک برنامه یا چند برنامهی مختلف همزمان بخواهند به انتهای یک فایل مشترک، مثلاً یک فایل لاگ، متن اضافه کنند، ممکن است خطهای نوشتهشده توسط هرکدام با هم قاطی شوند یا حتی بخشی از داده گم شود. این مشکل معمولاً در برنامههایی دیده میشود که چند نسخه از آنها همزمان روی یک سرور اجرا میشود یا در سیستمهایی که چند پردازش موازی گزارش خروجی خودشان را در یک فایل مشترک مینویسند.
نشانهی این مشکل، خطوطی است که در وسط یک پیام دیگر بریده شدهاند یا ترتیب زمانی گزارشها بههم ریخته است، بدون اینکه هیچ خطایی هنگام اجرا دیده شود. راهحل مطمئنتر این است که یا هر پردازش فایل لاگ جداگانهی خودش را داشته باشد، یا برای نوشتن همزمان از یک مکانیزم قفل فایل استفاده شود که تضمین میکند در هر لحظه فقط یک پردازش اجازهی نوشتن دارد.
سؤالهای رایج
آیا میتوان یک فایل را چند بار باز کرد؟
بله؛ اما اگر چند بخش برنامه همزمان در یک فایل بنویسند، احتمال خراب شدن محتوا وجود دارد.
تفاوت r و rb چیست؟
حالت r فایل را بهصورت متن میخواند و به encoding نیاز دارد. حالت rb بایتهای خام را برمیگرداند و برای تصویر، PDF و فایلهای باینری مناسب است.
آیا فاصله یا حروف فارسی در مسیر فایل مشکل ایجاد میکند؟
خیر. اگر مسیر را درست بنویسید، بهویژه با pathlib، فاصله و حروف فارسی معمولاً مشکلی ایجاد نمیکنند.
جمعبندی
برای کار مطمئن با فایلها، از with استفاده کنید، انکودینگ utf-8 را برای متن فارسی مشخص کنید، مسیرها را با pathlib بسازید و فایلهای بزرگ را خطبهخط یا تکهای بخوانید. رعایت همین اصول بیشتر خطاهای FileNotFoundError و UnicodeDecodeError را برطرف میکند.






