آموزش پایتون - خواندن فایل

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

باز کردن فایل برای خواندن

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

برای باز کردن یک فایل به‌منظور خواندن، از حالت 'r' استفاده می‌کنید. این حالت، حالت پیش‌فرض است؛ بنابراین، اگر فقط قصد خواندن فایل را دارید، می‌توانید آن را مشخص نکنید.

خواندن فایل با استفاده از متد read()

متد read() برای خواندن محتوای یک فایل در پایتون استفاده می‌شود. این متد تمام محتوای فایل را به‌صورت یک رشته واحد می‌خواند. این روش به‌ویژه زمانی مفید است که بخواهید کل فایل را یک‌باره پردازش کنید.

نحو

نحو پایه متد read() در پایتون به این صورت است:

file_object.read(size)

در اینجا:

  • file_object شیء فایل است که توسط تابع open() برگردانده می‌شود.
  • size تعداد بایت‌هایی است که باید از فایل خوانده شوند. این پارامتر اختیاری است. اگر حذف شود یا مقدار منفی داشته باشد، متد تا انتهای فایل را می‌خواند.

مثال

در مثال زیر، فایل "example.txt" را در حالت خواندن باز می‌کنیم. سپس با استفاده از متد read() تمام محتوای فایل را می‌خوانیم:

# Open the file in read mode
file = open('example.txt', 'r')

# Read the entire content of the file
content = file.read()

# Print the content
print(content)

# Close the file
file.close()

پس از اجرای کد بالا، خروجی زیر را دریافت می‌کنیم:

welcome to Tutorialspoint.

خواندن فایل با استفاده از متد readline()

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

نحو

نحو پایه متد readline() در پایتون به این صورت است:

file_object.readline(size)

در اینجا:

  • file_object شیء فایل است که توسط تابع open() برگردانده می‌شود.
  • size یک پارامتر اختیاری است که حداکثر تعداد بایت‌هایی را مشخص می‌کند که باید از خط خوانده شوند. اگر حذف شود یا مقدار منفی داشته باشد، متد تا انتهای خط را می‌خواند.

مثال

در مثال زیر، فایل "example.txt" را در حالت خواندن باز می‌کنیم. سپس با استفاده از متد readline() اولین خط فایل را می‌خوانیم:

# Open the file in read mode
file = open('example.txt', 'r')

# Read the first line of the file
line = file.readline()

# Print the line
print(line)

# Close the file
file.close()

خروجی کد بالا به این صورت است:

welcome to Tutorialspoint.

خواندن فایل با استفاده از متد readlines()

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

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

نحو

نحو پایه متد readlines() در پایتون به این صورت است:

file_object.readlines(hint)

در اینجا:

  • file_object شیء فایل است که توسط تابع open() برگردانده می‌شود.
  • hint یک پارامتر اختیاری است که تعداد بایت‌هایی را که باید خوانده شوند مشخص می‌کند. اگر این پارامتر تعیین شود، خطوط تا رسیدن به تعداد بایت مشخص‌شده خوانده می‌شوند و لزوماً کل فایل خوانده نخواهد شد.

مثال

در این مثال، فایل "example.txt" را در حالت خواندن باز می‌کنیم. سپس با استفاده از متد readlines() تمام خطوط فایل را می‌خوانیم و آن‌ها را به‌صورت فهرستی از رشته‌ها برمی‌گردانیم:

# Open the file in read mode
file = open('example.txt', 'r')

# Read all lines from the file
lines = file.readlines()

# Print the lines
for line in lines:
   print(line, end='')

# Close the file
file.close()

خروجی کد بالا به‌صورت زیر است:

welcome to Tutorialspoint.
Hi Surya.
How are you?.

استفاده از دستور "with"

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

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

مثال

در ادامه، یک مثال ساده از استفاده از دستور with برای باز کردن فایل، خواندن و چاپ محتوای آن آورده شده است:

# Using the with statement to open a file
with open('example.txt', 'r') as file:
   content = file.read()
   print(content)

خروجی به‌صورت زیر خواهد بود:

welcome to Tutorialspoint.
Hi Surya.
How are you?.

خواندن فایل در حالت باینری

به‌طور پیش‌فرض، عملیات خواندن و نوشتن روی یک شیء فایل با داده‌های متنی از نوع رشته انجام می‌شوند. اگر بخواهیم فایل‌هایی با انواع مختلف، مانند فایل‌های رسانه‌ای (mp3)، فایل‌های اجرایی (exe) یا تصاویر (jpg) را پردازش کنیم، باید فایل را در حالت باینری باز کنیم. برای این کار، پیشوند 'b' را به حالت خواندن یا نوشتن اضافه می‌کنیم.

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

فرض کنید فایل test.bin قبلاً در حالت باینری نوشته شده است:

# Open the file in binary write mode
with open('test.bin', 'wb') as f:
   data = b"Hello World"
   f.write(data)

مثال

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

# Open the file in binary read mode
with open('test.bin', 'rb') as f:
   data = f.read()
   print(data.decode(encoding='utf-8'))

خروجی زیر تولید خواهد شد:

Hello World

خواندن داده‌های عدد صحیح از فایل

برای نوشتن داده‌های عدد صحیح در یک فایل باینری، باید شیء عدد صحیح را با استفاده از متد to_bytes() به بایت تبدیل کنیم.

نوشتن یک عدد صحیح در فایل باینری

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

# Convert the integer to bytes and write to a binary file
n = 25
data = n.to_bytes(8, 'big')

with open('test.bin', 'wb') as f:
   f.write(data)

خواندن یک عدد صحیح از فایل باینری

برای خواندن مجدد داده‌های عدد صحیح از فایل باینری، خروجی تابع read() را با استفاده از متد from_bytes() دوباره به یک عدد صحیح تبدیل می‌کنیم:

# Read the binary data from the file and convert it back to an integer
with open('test.bin', 'rb') as f:
   data = f.read()
   n = int.from_bytes(data, 'big')
   print(n)

خواندن داده‌های اعشاری از فایل

برای کار با داده‌های ممیز شناور در فایل‌های باینری، باید از ماژول struct در کتابخانه استاندارد پایتون استفاده کنیم. این ماژول به تبدیل مقادیر پایتون به ساختارهای داده C و برعکس کمک می‌کند؛ ساختارهایی که به‌صورت اشیای بایتی پایتون نمایش داده می‌شوند.

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

برای نوشتن داده‌های ممیز شناور در یک فایل باینری، از متد struct.pack() استفاده می‌کنیم تا عدد اعشاری را به یک شیء بایتی تبدیل کنیم:

import struct

# Define a floating-point number
x = 23.50

# Pack the float into a binary format
data = struct.pack('f', x)

# Open the file in binary write mode and write the packed data
with open('test.bin', 'wb') as f:
   f.write(data)

خواندن اعداد اعشاری از فایل باینری

برای خواندن داده‌های ممیز شناور از یک فایل باینری، از متد struct.unpack() استفاده می‌کنیم تا شیء بایتی را دوباره به یک عدد اعشاری تبدیل کنیم:

import struct

# Open the file in binary read mode
with open('test.bin', 'rb') as f:
   # Read the binary data from the file
   data = f.read()

   # Unpack the binary data to retrieve the float
   x = struct.unpack('f', data)[0]

   # Print the float value
   print(x)

خواندن و نوشتن در فایل با استفاده از حالت "r+"

هنگامی که فایلی برای خواندن باز می‌شود (با حالت 'r' یا 'rb')، امکان نوشتن داده در آن وجود ندارد، مگر اینکه فایل بسته شود و دوباره در حالت دیگری باز شود. برای انجام هم‌زمان عملیات خواندن و نوشتن، نویسه '+' را به پارامتر حالت اضافه می‌کنیم. استفاده از حالت 'w+' یا 'r+' امکان استفاده از متدهای write() و read() را بدون بستن فایل فراهم می‌کند.

شیء فایل همچنین از تابع seek() پشتیبانی می‌کند که به شما امکان می‌دهد نشانگر خواندن و نوشتن را به هر موقعیت بایتی دلخواه در فایل منتقل کنید.

نحو

نحو متد seek() به این صورت است:

fileObject.seek(offset[, whence])

پارامترها

  • offset موقعیت نشانگر خواندن و نوشتن در داخل فایل است.

  • whence یک پارامتر اختیاری است که مقدار پیش‌فرض آن 0 است و به معنی تعیین موقعیت از ابتدای فایل است. مقدار 1 نشان می‌دهد که موقعیت نسبت به جایگاه فعلی محاسبه شود و مقدار 2 به معنی تعیین موقعیت نسبت به انتهای فایل است.

مثال

برنامه زیر یک فایل را در حالت 'r+' (حالت خواندن و نوشتن) باز می‌کند، به موقعیت مشخصی در فایل می‌رود و داده‌ها را از آن موقعیت می‌خواند:

# Open the file in read-write mode
with open("foo.txt", "r+") as fo:
   # Move the read/write pointer to the 10th byte position
   fo.seek(10, 0)

   # Read 3 bytes from the current position
   data = fo.read(3)

   # Print the read data
   print(data)

پس از اجرای کد بالا، خروجی زیر را دریافت می‌کنیم:

rat

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

هنگامی که فایلی برای نوشتن باز می‌شود (با حالت 'w' یا 'a')، امکان خواندن از آن وجود ندارد و تلاش برای انجام این کار باعث بروز خطای UnsupportedOperation می‌شود.

به همین ترتیب، هنگامی که فایلی برای خواندن باز می‌شود (با حالت 'r' یا 'rb')، نوشتن در آن مجاز نیست. برای جابه‌جایی بین عملیات خواندن و نوشتن، معمولاً باید فایل را ببندید و دوباره در حالت موردنظر باز کنید.

برای انجام هم‌زمان عملیات خواندن و نوشتن، می‌توانید نویسه '+' را به پارامتر حالت اضافه کنید. استفاده از حالت 'w+' یا 'r+' امکان استفاده از هر دو متد write() و read() را بدون نیاز به بستن فایل فراهم می‌کند.

علاوه بر این، شیء فایل از تابع seek() پشتیبانی می‌کند که به شما امکان می‌دهد نشانگر خواندن و نوشتن را به هر موقعیت بایتی دلخواه در فایل منتقل کنید.

مثال

در این مثال، فایل را در حالت 'r+' باز می‌کنیم و داده‌هایی در آن می‌نویسیم. متد seek(0) نشانگر را به ابتدای فایل منتقل می‌کند:

# Open the file in read-write mode
with open("foo.txt", "r+") as fo:
   # Write data to the file
   fo.write("This is a rat race")

   # Rewind the pointer to the beginning of the file
   fo.seek(0)

   # Read data from the file
   data = fo.read()
   print(data)

خواندن فایل از یک موقعیت مشخص

با استفاده از متد seek() می‌توانیم موقعیت فعلی فایل را روی یک موقعیت مشخص تنظیم کنیم.

  • اگر فایل برای افزودن داده با حالت 'a' یا 'a+' باز شده باشد، هرگونه جابه‌جایی با seek() در عملیات نوشتن بعدی بی‌اثر خواهد شد.
  • اگر فایل فقط برای نوشتن در حالت افزودن با حالت 'a' باز شده باشد، این متد عملاً هیچ کاری انجام نمی‌دهد؛ اما برای فایل‌هایی که در حالت افزودن همراه با امکان خواندن باز شده‌اند (حالت 'a+') همچنان مفید است.
  • اگر فایل در حالت متنی با استفاده از 't' باز شده باشد، فقط موقعیت‌هایی معتبر هستند که توسط tell() برگردانده شده‌اند. استفاده از موقعیت‌های دیگر باعث رفتاری تعریف‌نشده می‌شود.

توجه داشته باشید که همه اشیای فایل از جابه‌جایی نشانگر پشتیبانی نمی‌کنند.

مثال

مثال زیر نحوه استفاده از متد seek() را برای انجام هم‌زمان عملیات خواندن و نوشتن روی یک فایل نشان می‌دهد. فایل در حالت w+ (حالت خواندن و نوشتن) باز می‌شود، مقداری داده به آن اضافه می‌کنیم و سپس فایل را می‌خوانیم و محتوای آن را در یک موقعیت مشخص تغییر می‌دهیم:

# Open a file in read-write mode
fo = open("foo.txt", "w+")

# Write initial data to the file
fo.write("This is a rat race")

# Seek to a specific position in the file
fo.seek(10, 0)

# Read a few bytes from the current position
data = fo.read(3)
print("Data read from position 10:", data)

# Seek back to the same position
fo.seek(10, 0)

# Overwrite the earlier contents with new text
fo.write("cat")

# Rewind to the beginning of the file
fo.seek(0, 0)

# Read the entire file content
data = fo.read()
print("Updated file content:", data)

# Close the file
fo.close()

خروجی کد بالا به این صورت است:

Data read from position 10: rat
Updated file content: This is a cat race

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.