خواندن و نوشتن فایل‌ها در پایتون

این مقاله تکمیلی در ادامه دوره آموزشی ارائه می‌شود. 

در این مقاله شما با مفهوم خواندن و نوشتن فایل‌ها در پایتون آشنا خواهید شد.


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

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

از این رو در پایتون، عملیات مربوط به فایل به ترتیب زیر انجام می شود:

  1. باز کردن فایل
  2. خواندن یا نوشتن (انجام عملیات)
  3. بستن فایل

باز کردن فایل 

در پایتون برای این منظور یک تابع built-in در نظر گرفته شده است. این تابع یک شی بازمی‌گرداند که برای خواندن و یا تغییر در فایل مورد استفاده قرار می‌گیرد:

f = open("test.txt")    # open file in current directory
f = open("C:/test.txt")  # specifying full path

ما می‌توانیم هنگام باز کردن فایل حالت (mode) کار با فایل را نیز مشخص کنیم. برای نمونه حالت خواندن با r، و حالت نوشتن با w مشخص می‌شود. در زیر همه موارد ممکن آورد شده است:

  • r  => فایل برای خواندن باز می‌کند (پیش فرض)
  • w  => فایل را برای نوشتن باز می‌کند. اگر فایلی وجود نداشته باشد، فایل جدیدی ایجاد می‌کند در غیر اینصورت محتوای فایل بدون حذف کردن فایل پاک می‌شود و فایل را آماده نوشتن می‌کند.
  • x  => فایل را برای نوشتن ایجاد می‌کند. اگر فایلی وجود داشته باشد، خطای FileExistsError را می‌دهد
  • a  => فایل را برای نوشتن باز می‌کند. اگر فایلی وجود نداشته باشد، فایل جدیدی ایجاد می‌کند در غیر اینصورت فایل را برای افزودن دیتا به انتهای آن آماده نوشتن می‌کند.
  • t  => باز کردن فایل در حالت text (پیش فرض)
  • b  => باز کردن فایل در حالت باینری
  • +  => باز کردن فایل برای خواندن و نوشتن 
f = open("test.txt")      # equivalent to 'r' or 'rt'
f = open("test.txt",'w')  # write in text mode
f = open("img.bmp",'r+b') # read and write in binary mode

در پایتون برخلاف سایر زبان‌ها کاراکتر a تا زمانی که رمزنگاری (encode) نشود معادل عدد 97 نیست. به عبارتی به دلیل اینکه رمزنگاری در این زبان به پلتفرم بستگی دارد (cp1252 در ویندوز، utf-8 در لینوکس)، نباید به رمزنگاری پیش‌فرض اعتماد کنیم چرا که کد ما در پلتفرم‌های مختلف رفتار مختلفی نشان خواهد داد.

بنابراین توصیه می‌شود هنگام کار با فایل‌ها نوع رمزنگاری را مشخص کنید:

f = open("test.txt", mode='r', encoding='utf-8')

بستن فایل

همانطور که پیش از این در آموزش مدیریت خطا در لینک زیر نیز گفته شد یک راه امن جهت بستن فایل استفاده از دستور try...finally است.

این روش تضمین می‌کند که فایل حتی اگر استثنایی رخ دهد بسته شود

try:
   f = open("test.txt", encoding = 'utf-8')
   # perform file operations
finally:
   f.close()

بهترین روش برای بستن یک فایل استفاده از ساختار with است. در این روش پس از اجرای عملیات درون بلوک with فایل بسته می‌شود و دیگر نیاز به استفاده از دستور close نیست:

with open("test.txt", encoding = 'utf-8') as f:
   # perform file operations

نوشتن درون فایل

برای نوشتن درون یک فایل کافی فایل را در یکی از حالت‌های w, a  و یا x باز کنید. نوشتن درون فایل توسط تابع write انجام می‌شود:

with open("test.txt",'w',encoding = 'utf-8') as f:
   f.write("This is\n")
   f.write("my first file\n")
   f.write("This file\n")
   f.write("contains four lines\n")

خواندن فایل

برای خواندن فایل تنها کافیست فایل را در حالت r باز کنیم. و برای خواندن از تابع read استفاده کنیم:

f = open("test.txt",'r',encoding = 'utf-8')
f.read(4)    #  خواندن 4 کاراکتر اول
>> 'This'

f.read(4)    # خواندن 4 کاراکتر بعدی
>>‌ ' is '

f.read()     # خواندن باقی خطوط
>>‌ 'my first file\nThis file\ncontains four lines\n'

f.read()  # خواندن بعدی تنها یک رشته خالی برمی‌گرداند
>>‌ ''

ما همچنین می‌توانیم به کمک یک حلقه خطوط یک فایل باز شده را بخوانیم. فایل باز شده قبلی را با کمک دستور (0)seek به ابتدا اولین خط از فایل می‌بریم سپس خطوط را با حلقه می‌خوانیم

for line in f:
	print(line , end = '')

>> This is
my first file
This file
contains four lines

در زیر لیست تمامی توابعی که هنگام کار با فایل‌ها می‌توان استفاده کرد، آورده شده است:

  • close  => بستن فایل باز شدن
  • detach  => حافظه نوشتن برای یک فایل جدا می‌کند و آن مقدار را باز می‌گرداند
  • fileno  => یک عدد صحیح مربوط به هر فایل را باز می‌گرداند
  • flush => پاک کردن حافظه نوشتن برای یک فایل
  • isatty  => مقدار True را بازمی‌گرداند اگر فایل قابل تعامل باشد
  • read => خواندن خطوط فایل
  • readable  => مقدار True را بازمی‌گرداند اگر فایل قابل خواندن باشد
  • readline  => یک خط از فایل را می‌خواند و پس می‌دهد
  • readlines  => بیک لیست از خطوط فایل را پس می‌دهد
  • seek  => موقعیت فایل را به خط nام (ورودی) می‌برد
  • seekable  => مقدار True را بازمی‌گرداند اگر فایل قابل seek کردن، باشد
  • tell  => موقعیت فعلی در خواندن را پس می‌دهد
  • truncate => این تابع محتوای فایل را با توجه به تعداد کاراکترها (n به عنوان ورودی) تغییر سایز می‌دهد به این معنی که به غیر از n کاراکتر اول را باقی را پاک می‌کند.
  • writable  => مقدار True را بازمی‌گرداند اگر فایل قابل نوشتن باشد
  • write  =>نوشتن در فایل
  • writelines  =>نوشتن یک لیست از خطوط در فایل