برنامه آموزش زبان "چرب زبان" نسل جدید اپ آموزش زبان در ایران

دانلود
برنامه نویسی

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

اکثر خطاهایی که برنامه‌نویسان تازه‌کار هنگام کار با فایل در پایتون می‌گیرند، ربطی به منطق برنامه ندارد؛ ریشه‌شان یا در مسیر اشتباه فایل است یا در انتخاب نادرست متد خواندن. این راهنما دقیقاً همین دو نقطه را باز می‌کند: چطور فایل را درست باز و بخوانیم، چطور مسیرش را طوری بدهیم که روی سیستم‌عامل‌های مختلف هم کار کند، و چه مشکلاتی هستند که معمولاً کسی از قبل هشدارشان را نمی‌دهد.

پیش‌نیازها

نصب بودن پایتون ۳ روی سیستم

داشتن یک فایل متنی نمونه مانند data.txt

آشنایی مقدماتی با اجرای برنامه پایتون

باز کردن فایل با تابع open

برای باز کردن فایل از تابع open استفاده می‌کنیم. این تابع فایل را باز می‌کند و یک شیء فایل در اختیار برنامه قرار می‌دهد. سپس می‌توانیم محتوای فایل را بخوانیم یا در آن بنویسیم.

باز کردن فایل با تابع open

در این کد، data.txt نام فایل است. مقدار r یعنی فایل فقط برای خواندن باز شود. گزینه8 utf-نیز کمک می‌کند متن فارسی به‌درستی نمایش داده شود.

حالت‌های مهم باز کردن فایل

حالت کاربرد
r خواندن فایل؛ حالت پیش‌فرض
w نوشتن در فایل؛ محتوای قبلی پاک می‌شود
a اضافه کردن متن به انتهای فایل
r+ خواندن و نوشتن هم‌زمان
rb خواندن فایل باینری مانند تصویر یا PDF

نکته مهم: برای فایل‌هایی که متن فارسی دارند، همیشه 8encoding=utf- را بنویسید. در غیر این صورت ممکن است حروف فارسی ناخوانا شوند.

چرا بهتر است از with استفاده کنیم؟

فایلی که باز می‌شود باید پس از پایان کار بسته شود. روش with این کار را خودکار انجام می‌دهد. حتی اگر هنگام اجرای برنامه خطایی رخ دهد، فایل به‌درستی بسته خواهد شد.

چرا بهتر است از with استفاده کنیم؟

پس از تمام شدن بلوک with، فایل خودکار بسته می‌شود و دیگر نیازی به نوشتن () f.close نیست. برای بیشتر برنامه‌ها همین روش بهترین انتخاب است.

تفاوت read، readline و readlines

()read: تمام محتوای فایل را یک‌جا و به‌شکل یک رشته می‌خواند. برای فایل‌های کوچک مناسب است.

()readline: فقط یک خط را در هر بار اجرا می‌خواند.

()readlines: تمام خط‌ها را می‌خواند و آن‌ها را داخل یک فهرست قرار می‌دهد.

تفاوت read، readline و readlines

در readlines هر خط یک عضو از فهرست است. معمولاً علامت رفتن به خط بعد نیز در انتهای هر عضو باقی می‌ماند.

روش بهتر برای خواندن خط‌به‌خط

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

روش بهتر برای خواندن خط‌به‌خط

متد strip فاصله‌ها و علامت رفتن به خط بعد را از ابتدا و انتهای هر خط حذف می‌کند.

نوشتن مسیر فایل به شکل صحیح

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

برای دیدن پوشه کاری فعلی از کد زیر استفاده کنید:

نوشتن مسیر فایل به شکل صحیح

مسیر فایل در ویندوز

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

مسیر فایل در ویندوز

روش پیشنهادی: استفاده از pathlib

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

استفاده از pathlib

علامت / در 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 را برطرف می‌کند.

کوانتوم سافت

تیم حرفه ای و متخصص کوانتوم سافت، مقالات بروز برای آشنایی کاربران عزیز به زبان فارسی ارائه می دهد تا در جریان ترندهای شگفت انگیز تکنولوژی و هوش مصنوعی باشید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا