در نوشته کار با فایل ها در پایتون – بخش یکم درباره متد ()open و توصیف گر فایل (File Descriptor) و چگونگی خواندن فایل ها در زبان پایتون گفتگو کردیم. در این نوشته و در دنباله کار با فایل ها در پایتون، می خواهیم چگونگی خواندن و نوشتن فایل ها در زبان پایتون را بگوییم. در نوشته های پیش رو، چگونگی هم کنشی (تعامل) با فایلهای دودویی را خواهیم گفت.

خواندن کل خط های فایل توسط تابع ()readlines

 تابع ()readlines کل یک فایل را تا زمانی که به انتهای فایل (EOF – End of File) برسد می خواند و یک لیست از خطوط را به عنوان خروجی برمی گرداند. قطعه کد ۲۲ و ۲۳ توسط تابع ()readlines کل فایل را می خواند و آنرا درون متغیر lines ذخیره می کند. در قطعه کد ۲۳ توسط حلقه for محتوای لیست lines نشان داده می شود.

 در قطعه کدهای ۲۲ و ۲۳ چون در انتهای هر خط کاراکتر n\ وجود دارد، باید از تابع ()split برای حذف این کاراکتر استفاده کنیم. توجه کنید که هر خط به صورت یک رشته در لیست lines ذخیره می شود که انتهای هر رشته کاراکتر n\ وجود دارد. (مثال در قطعه کد ۲۴) خروجی تابع ()readlines یک لیست است، بنابراین می توانید از تابع ()len برای پیدا کردن تعداد خطوط یک فایل استفاده کنید.فرض کنید فایلی دارید که پاسخ Yes یا No به ۱۰ سوال را در خود ذخیره کرده است و می خواهید تعداد پاسخ های Yes و No را پیدا کنید.

نوشتن بر روی فایل توسط تابع ()write

اگر فایل را در یکی از حالت های w یا a یا +r توسط تابع ()open باز کرده باشید، تابع ()write یک رشته را درون فایل می نویسید. این تابع هیچ مقدار برگشتی ندارد. زمانی می توان نتیجه نوشته شدن رشته ها را دید که فایل توسط تابع ()close بسته شود. در حالت های w و a و +r اگر فایل وجود نداشته باشد، به صورت خودکار در محل تعیین شده ایجاد خواهد شد. قطعه کد ۲۵ توسط تابع ()readlines از یک فایل می خواند و سپس بر روی فایل دیگر می نویسد.

در قطعه کد ۲۶ توسط تابع ()write یک لیست از پاسخ های Yes و  No را درون فایل می نویسیم. در خطوط ۶ و ۷ ابتدا هر عنصر از لیست را درون لیست نوشته می شود و سپس کاراکتر n\ در انتهای رشته قبلی نوشته می شود.

تابع ()write یک رشته را بر روی فایل می نویسد و اگر نوع عدد صحیح یا اعشاری را دریافت کند، استثنای ErrorType نشان داده می شود. برای رفع مشکل باید ورودی عددی به تابع ()write را با تابع ()str به رشته تبدیل کنید.

حالت w محتوای جدید را بر روی محتوای قبلی بازنویسی می کند ولی حالت a محتوای جدید را در انتهای محتوای قبلی بازنویسی می کند. قطعه کد ۲۸ لیست answers را در انتهای فایل new_filename.txt که در قطعه کد ۲۶ ایجاد شده بود.

نوشتن چند خط بر روی فایل توسط تابع ()writelines

تابع ()write در هر لحظه یک خط را بر روی فایل می نویسد ولی تابع ()writelines همزمان چندین خط را بر روی فایل می نویسد. قطعه کد ۲۹ از تابع ()writelines برای نوشتن تمامی عناصر لیست answers درون فایل filename.txt استفاده می کند.

ورودی تابع یک توالی از رشته ها است که می تواند یک لیست یا تاپل را که هر عنصر آن رشته است به عنوان ورودی دریافت کند. در قطعه کد ۲۹ چون کاراکتر newline (یا n\) در انتهای عناصر لیست وجود ندارد، تمامی عناصر لیست در کنار هم درون فایل ذخیره می شوند.

در قطعه کد ۳۱ دو فایل filename1.txt و filename2.txt ایجاد می شوند. لیست list_of_lines ها درون فایل filename1.txt و تاپل tuple_of_lines ها درون فایل filename2.txt نوشته می شوند. تفاوت در این است که در انتهای عناصر تاپل کاراکتر n\ آورده شده است، پس هر عنصر از تاپل در یک خط از فایل filename.txt نوشته می شود ولی عناصر لیست همگی در یک خط نوشته می شوند.