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

در برنامه‌نویسی با اهداف مختلفی نیاز داریم با فایل‌ها کار کنیم. در این آموزش نحوه کار با فایل در پایتون (Python File Handling) را بررسی کرده و ترفندهای کاربردی آن را می‌آموزیم.

برای کار با فایل در پایتون نیاز به استفاده و Import کردن هیچ ماژول اضافی و مازادی نداریم.

برای کار با فایل باید از شئ File در پایتون استفاده کنیم. این شئ (Object) اطلاعاتی از فایل و توابعی ساده‌ای در اختیارمان می‌گذارد تا بتوانیم با فایل‌ها به راحتی کار کنیم.

در اولین قدم برای انجام عملیات‌های مختلف روی فایل، ایجاد یک شیء از File مورد نظر است. برای این کار از تابع open() استفاده می‌کنیم.

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

file_name = "test.txt"
file = open( file_name, "a+" )

در این آموزش من از پایتون نسخه 3 استفاده می‌کنم؛ در نسخه 2.7 نیز روند کار به صورت مشابه هست و ممکن است در syntax دستورات تفاوت‌های کوچکی باشد.

حالت (mode) های مختلف باز کردن فایل

همان‌طور که می‌دانید هنگام باز کردن یک فایل برای خواندن یا نوشتن، حالت‌های مختلفی وجود دارد. برخی از مهم‌ترینِ آن‌ها عبارت‌اند از:

  • r : خواندن (شروع از ابتدای فایل)
  • r+ : خواندن و نوشتن (شروع از ابتدای فایل)
  • w : ایجاد فایل برای نوشتن (شروع از ابتدا)
  • w+ : ایجاد فایل برای نوشتن و خواندن (شروع از ابتدا)
  • a : خواندن (شروع از انتها)
  • a+ : خواندن و نوشتن (شروع از انتها)

در دو مورد سوم و چهارم (حالت w) در صورتی که فایلی از قبل وجود داشته باشد، فایل را پاک کرده و یک فایل جدید ایجاد می‌کند.

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

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

اگر با اکسل یا csv کار می‌کنید، به آموزش‌های مخصوصشان بروید: اکسل در پایتون و کار با csv در پایتون.

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

با این تفاصیر، اگر تابع open() را برای فایلی که وجود ندارد فراخوانی کنید، آن فایل برایتان ایجاد شده و می‌توانید اطلاعاتتان را درون آن قرار دهید.

به همین سادگی می‌توان یک فایل جدید با هر فرمت دلخواهی ایجاد کرده و داده‌های متنی خود را درون آن ذخیره کرد.

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

مقدار برگردانده شده توسط تابع open() را در یک متغیر ذخیره می‌کنیم تا بعداً بتوانیم توابع مورد نیاز خود را روی آن صدا زده و عملیات‌های مختلفی روی فایل خود انجام دهیم.

file_name = "test.txt"
file = open(file_name)

برای درک بهتر، از یک فایل کمکی استفاده می‌کنیم که محتویات زیر را دارد:

dear user,
This is a test file!
visit us at www.SabzDanesh.com

در کدهای مثال زده شده، موارد کامنت شده (با استفاده از # در ابتدای خط) به معنای خروجی حاصل از اجرای کد می‌باشد.

خواندن فایل در پایتون

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

تابع read

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

file = open(file_name)
print( file.read() )

# dear user,
# This is a test file!
# visit us at www.SabzDanesh.com

توجه کنید که اگر این تابع را دو بار پشت سر هم صدا بزنیم، در دفعه دوم، هیچ مقداری برای ما چاپ نمی‌شود! به دلیل اینکه تمام فایل تا انتها بررسی و خوانده شده و دیگر محتوای بیشتری برای نمایش نداریم.

تابع read() می‌تواند یک آرگومان ورودی به صورت دلخواه داشته باشد؛ این آرگومان از نوع عددی بوده و مشخص می‌کند که چه تعداد کاراکتر خوانده شود.

file = open(file_name)
print( file.read(7) )

# dear us

تابع readline برای خواندن خط به خط فایل در پایتون

این تابع در هر بار صدا زده شدن روی فایل، یک خط از فایل را به ما بر می‌گرداند. یعنی می‌توان آن را به تعداد خطوط موجود در فایل (با احتساب خطوط خالی) فراخوانی کنیم.

file = open(file_name)
print( file.readline() )
print( file.readline() )

# dear user,
#
# This is a test file!
#

توجه کنید که در انتهای هر خط فایل، کاراکتر سطر جدید (\n) وجود دارد و تابع print که ما در مثال استفاده می‌کنیم نیز پس از هر بار چاپ کردن، به سطر جدید می‌رود؛ به همین دلیل است که در نتیجه کد فوق، برای هر خط، دو بار به سطر جدید می‌رویم.

تابع readlines

گاهی در هنگام خواندن فایل در پایتون لازم داریم تا تمام محتویات یک فایل را درون یک لیست داشته باشیم. اولین راه حل خواندن تک تک خطوط و ریختن آن‌ها در یک لیست پایتون است. اما تابع readlines() این کار را با سرعت بسیار زیاد برایمان انجام می‌دهد.

با صدا زدن این تابع، یک لیست به عنوان خروجی داریم که شامل خطوط موجود در فایل است. یعنی هر عضو این لیست معادل یک خط در درون فایل خواهد بود.

file = open(file_name)
print( file.readlines() )

# ['dear user,\n', 'This is a test file!\n', 'visit us at www.SabzDanesh.com']

استفاده از حلقه برای خواندن فایل

یک روش ساده برای خواندن خط به خط یک فایل در پایتون، استفاده از حلقه for پایتون یا به عبارتی for each می‌باشد.

در صورتی که متغیر فایل را در یک حلقه استفاده کنیم، مشابه آن است که تابع readlines() را روی آن صدا زده و لیست نتیجه را به حلقه for داده‌ایم.

file = open(file_name)
for line in file:
    print(line)

# dear user,
#
# This is a test file!
#
# visit us at www.SabzDanesh.com

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

همیشه دقت کنید که پس از اینکه کارتان با فایل باز شده تمام شد، با صدا زدن تابع close() روی شئ فایل، آن را ببندید. هر چند که پس از اتمام اجرای برنامه پایتون، فایل به صورت خودکار بسته می‌شود، اما این کار به آزاد شدن زودتر منابع کمک خواهد کرد.

همچنین اگر در هنگام نوشتن یک فایل باشید و فایل به درستی بسته نشود، ممکن است چیزی در فایل ذخیره نشود. به نوعی تغییراتتان اعمال نخواهد شد.

file.close()

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

برای نوشتن فایل متنی در پایتون دو تابع اصلی وجود دارد. در ادامه این دو تابع را با هم بررسی می‌کنیم.

تابع write برای نوشتن رشته در فایل

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

file_name2 = "test2.txt"
file = open(file_name2, "w")
file.write("hello world!")
file.close()

با اجرای قطعه کد بالا، درون فایل text2.txt که در کنار برنامه وجود داشته یا ایجاد شده است، صرفاً عبارت معروف hello world! نوشته خواهد شد.

تابع writelines

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

file = open(file_name, "w")
file.writelines( ["hello world!\n", "test line"] )
file.close()

اضافه کردن محتوا به محتوای موجود در فایل پایتون

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

در صورتی که بخواهیم به محتوای فعلی یک فایل، محتوای جدیدی اضافه کنیم، می‌بایست فایل را در حالت a (ابتدای کلمه append) باز کرده و سپس عملیات نوشتن در فایل را انجام دهیم.

گرفتن ورودی در پایتون با تابع input

گرفتن ورودی در پایتون با تابع input

حذف فایل در پایتون

برای حذف کردن یک فایل در زبان پایتون، نیاز به یک ماژول سیستمی داریم. این ماژول یا کتابخانه به طور پیش‌فرض در پایتون وجود دارد و می‌توان با اضافه کردن ماژولی به نام os آن را به برنامه خودمان اضافه کنیم.

بنابراین در ابتدای برنامه خود کد زیر را می‌نویسیم.

import os

این ماژول یک تابع به نام remove() دارد که با صدا زدن و دادن نام فایل به عنوان ورودی، فایل مورد نظر حذف می‌شود. برای درک بهتر به قطعه کد زیر دقت کنید. (بیشتر بدانید: کار با ماژول در پایتون)

os.remove("test2.txt")

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

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

برای این کار می‌توان از توابع دیگری که در ماژول os وجود دارد استفاده کرده و مانند قطعه کد زیر، عملیات حذف را انجام دهیم.

if os.path.exists("delete_file.txt"):
    os.remove("delete_file.txt")

مدیریت خطا در خواندن فایل پایتون

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

دلایل رایج خطا در نوشتن فایل پایتون یا خواندن آن عبارت‌اند از:

  • فایل مورد نظر توسط برنامه دیگری در حال استفاده است. (برای باز شدن مجدد توسط سیستم عامل قفل شده)
  • مسیر فایل اشتباه وارد شده و چنین مسیری وجود ندارد.
  • نام فایل به درستی وارد نشده و از کاراکترهای غیرمجاز در آن استفاده شده است.

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

یک مثال ساده از تلاش برای باز کردن فایل در پایتون به صورت زیر است.

try:
    open("testFile.txt")
except:
    print("An Error Occurred While Opening File!")

در جلسه قبلی آموزش، با روش مدیریت خطا آشنا شدیم. اگر ساختار بالا برایتان ناآشناست، جلسه قبلی را مرور کنید.

جمع‌بندی: کار با فایل در پایتون

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

روش‌های خواندن فایل در پایتون را با هم بررسی کردیم. از تابع open() برای باز کردن فایل استفاده می‌شود. این تابع یک ورودی می‌گیرد که آدرس و نام فایل مورد نظر است. با 3 تابع اصلی برای کار با فایل (مثلاً خواندن فایل txt) آشنا شدیم:

readبرای خواند کل محتوای فایل
readlineبرای خواندن خط به خط فایل
readlinesتبدیل محتوای فایل به لیست

سپس با روش‌های نوشتن فایل در پایتون آشنا شدیم. دیدیم که کار با فایل در پایتون برای نوشتن اطلاعات بسیار ساده بوده و می‌توان به کمک توابع write() یا writelines() محتوای دلخواه خود را در فایل بنویسیم.

در انتها نیز os.remove() برای حذف فایل معرفی شد. همچنین در یک مثال، از ساختار try except برای جلوگیری از خطای خواندن فایل در پایتون استفاده کردیم.

امیدوارم از این پس بتوانید عملیات کار با فایل در پایتون را به راحتی انجام داده و از آن لذت ببرید. بخش دیدگاه‌های آموزش برای نظرات و سؤالات شماست!

این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش پایتون