کار با فایل ها در پایتون: خواندن (read) و نوشتن (write)

06 آبان 1398
کار با فایل ها در پایتون: خواندن (read) و نوشتن (write)

کار با فایل ها در پایتون

مدیریت و کار با فایل ها از قسمت های مهم هر برنامه ای است. از همین رو زبان پایتون توابع متعددی برای ایجاد، خواندن، بروزرسانی و حذف فایل ها دارد. اصلی ترین تابع برای کار با فایل ها در پایتون تابع()open است که دو پارامتر می گیرد: نام فایل و mode (حالت دسترسی). برای باز کردن فایل ها چهار حالت دسترسی (mode) وجود دارد:

  • حالت "r" که مخفف Read و به معنی خواندن است. این مقدار، حالت پیش فرض دسترسی شما می باشد و کارش خواندن اطلاعات از روی فایل است. در صورتی که فایل درخواست شده وجود نداشته باشد یک خطا برمی گرداند.
  • حالت "a" که مخفف Append و به معنی ضمیمه کردن است. کار این تابع باز کردن یک فایل برای ضمیمه کردن فایل/مقدار دیگری به آن است و چنانچه فایل درخواست داده شده وجود نداشته باشد، یک فایل جدید به همان نام می سازد.
  • حالت "w" که مخفف write و به معنی نوشتن است. کار این تابع باز کردن فایل برای نوشتن و ایجاد تغییرات در آن است و چنانچه فایل درخواست داده شده وجود نداشته باشد، یک فایل جدید به همان نام می سازد.
  • حالت "x" که نماینده ی create (به معنی ایجاد) است. کار این تابع ایجاد کردن یک فایل جدید است و در صورتی که آن فایل از قبل وجود داشته باشد به شما خطایی برمی گرداند.

همچنین می توانید مشخص کنید که فایل به صورت باینری (دودویی) یا متنی در دسترس قرار گیرد:

  • "t" به معنی دسترسی به صورت متنی است که حالت پیش فرض می باشد.
  • "b" به معنی دسترسی به صورت باینری (دودویی) است.

خواندن فایل ها (Read)

حالا که با انواع حالت های دسترسی آشنا شده ایم نوبت به استفاده ی عملی از آن ها در چند مثال مختلف است. اگر بخواهیم یک فایل را فقط برای خواندن باز کنیم می توانیم فقط نام فایل را به تابع ()open بدهیم:

f = open("demofile.txt")

در واقع کد بالا معادل این کد است:

f = open("demofile.txt", "rt")

همانطور که قبلا گفته بودم حرف r برای read (خواندن) و حرف t برای دسترسی به صورت متنی (text) است اما اگر یادتان باشد هر دوی این موارد پیش فرض بودند بنابراین نیازی به ذکر آن ها نیست. همچنین حواستان باشد که فایل درخواست شده از قبل وجود داشته باشد، در غیر این صورت با خطا مواجه خواهید شد.

حالا فرض کنید یک فایل متنی ساده به نام demofile.txt روی سرور ما قرار دارد و محتویات درون آن به شکل زیر است:

Hello! Welcome to demofile.txt
This file is for testing purposes.
Good Luck!

همانطور که می دانید برای باز کردن فایل از تابع ()open استفاده میکنیم. زمانی که فایل را با استفاده از این متد باز کنید، پایتون به فایل و محتویات آن دسترسی خواهد داشت و متد های دیگری مانند ()read:

f = open("demofile.txt", "r")

print(f.read())

خروجی:

Hello! Welcome to demofile.txt
This file is for testing purposes.
Good Luck!

همانطور که می بینید در حالت پیش فرض متد ()read تمام متن را برمی گرداند اما می توانیم تعداد کاراکترهای برگشتی را مشخص کنیم:

f = open("demofile.txt", "r")

print(f.read(5))

خروجی:

Hello

اگر دوست دارید خط اول فایل برگردانده شود باید از متد ()readline استفاده کنید:

f = open("demofile.txt", "r")

print(f.readline())

خروجی:

Hello! Welcome to demofile.txt

در صورتی که دو بار پشت سر هم از این متد استفاده کنید، دو خط اول فایل برگردانده می شوند:

f = open("demofile.txt", "r")

print(f.readline())
print(f.readline())

خروجی:

Hello! Welcome to demofile.txt
This file is for testing purposes.

و در نهایت در صورتی که از یک حلقه استفاده کنید (مانند حلقه ی for) می توانید تک تک خطوط فایل را بخوانیم:

f = open("demofile.txt", "r")
for x in f:
  print(x)

خروجی:

Hello! Welcome to demofile.txt
This file is for testing purposes.
Good Luck!

هشدار: همیشه پس از اتمام عملیات، فایل را با تابع ()close ببنیدید. این کار دو دلیل اصلی دارد: اولا تا زمانی که فایل را نبندید، آن فایل فضای مموری شما را اشغال می کند و برنامه ی شما کُند می شود. دوما برخی اوقات به دلایلی مانند buffering تا زمانی که فایل را نبندید، تغییرات در فایل اعمال نخواهد شد.

مثالی از بستن فایل:

f = open("demofile.txt", "r")

print(f.readline())

f.close()

خروجی:

Hello! Welcome to demofile.txt

نوشتن در فایل ها (write)

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

  • "a" : متن شما را به انتهای فایل اضافه می کند (ضمیمه کردن) بنابراین محتوای قبلی حذف نمی شود.
  • "w" : تمام محتوای قبلی را پاک کرده و محتوای جدید را جایگزین آن می کند.

در مثال زیر می خواهیم فایلی به نام demofile2.txt را باز کرده و محتویات جدیدی به آن اضافه کنیم:

f = open("demofile2.txt", "a")
f.write("Now the file has more content!")
f.close()

#open and read the file after the appending:
f = open("demofile2.txt", "r")
print(f.read())

خروجی:

Hello! Welcome to demofile2.txt
This file is for testing purposes.
Good Luck!Now the file has more content!

در مثال زیر می خواهیم فایلی به نام demofile3.txt را باز کرده و محتویات قبلی را با محتویات جدیدی جایگزین کنیم:

f = open("demofile3.txt", "w")
f.write("Woops! I have deleted the content!")
f.close()

#open and read the file after the appending:
f = open("demofile3.txt", "r")
print(f.read())

خروجی:

Woops! I have deleted the content!

اما اگر می خواهید محتوای جدیدی در فایلی جدید بنویسید باید ابتدا آن فایل را بسازید. برای این کار یکی از پارامتر های زیر را به تابع open پاس بدهید:

  • "x" : فایلی می سازد و اگر فایل از قبل وجود داشته باشد خطایی برمی گرداند.
  • "a" : اگر فایل مشخص شده وجود نداشته باشد یک فایل جدید می سازد.
  • "w" : اگر فایل مشخص شده وجود نداشته باشد یک فایل جدید می سازد.

به طور مثال در کد زیر یک فایل به نام myfile.txt می سازیم:

f = open("myfile.txt", "x")

نتیجه ی این کد ساخته شدن یک فایل جدید و البته خالی است. روش دیگر به صورت زیر است:

f = open("myfile.txt", "w")

اگر فایلی به نام myfile.txt وجود نداشته باشد آن گاه یک فایل جدید به همین نام ساخته خواهد شد.

حذف فایل ها

برای حذف فایل ها باید ماژول os را وارد کرده و سپس از متد()os.remove استفاده کنید. به طور مثال اگر بخواهیم فایل demofile.txt را حذف کنیم، میگوییم:

import os
os.remove("demofile.txt")

البته بهتر است فایل ها را بدین شکل (مستقیما) حذف نکنید، چرا که اگر چنین فایلی وجود نداشته باشد با خطا مواجه می شوید. بهتر است ابتدا چک کنید که آیا فلان فایل موجود است یا خیر و سپس آن را حذف کنید:

import os
if os.path.exists("demofile.txt"):
  os.remove("demofile.txt")
else:
  print("The file does not exist")

البته یادتان باشد که با استفاده از ()os.rmdir میتوان یک دیرکتوری (پوشه) را حذف کرد. در مثال زیر می خواهیم یک پوشه به نام myfolder را حذف کنیم:

import os
os.rmdir("myfolder")

هشدار: شما تنها اجازه ی حذف پوشه های خالی را دارید!

همانطور که می بینید کار با فایل ها در پایتون بسیار ساده است و اصلا مبحث پیچیده ای ندارد.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری از مقدماتی تا پیشرفته با پایتون توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

mostafa
17 دی 1399
پس بقیه مباحث چی شد خیلی چیزارو جا انداختی tell() seek() readlines() ... ...

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.