شنبه ۲۹ دي ۱۴۰۳
Tut24 آموزش برنامه نویسی و مجله تخصصی فناوری ورود/عضویت

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

در این درس، ما توابع پایه‌ای I/O (ورود و خروج) را که در پایتون در دسترس هستند، پوشش خواهیم داد.

ساده‌ترین راه برای تولید خروجی در پایتون استفاده از دستور print است. شما می‌توانید صفر یا چند عبارت را به صورت جداگانه با کاما به print ارسال کنید. print عباراتی که به آن پاس می‌دهید را به رشته تبدیل کرده و نتیجه را به عنوان خروجی استاندارد نمایش می‌دهد. به عنوان مثال:

print("Python is really a great language,", "isn't it?")

خروجی دستور زیر به صورت زیر می باشد:

Python is really a great language, isn't it?

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

پایتون دارای دو تابع داخلی به نام‌های raw_input و input است که برای خواندن یک خط متن از ورودی طراحی شده‌اند و به طور پیش‌فرض از صفحه کلید خوانده می‌شوند.

  • raw_input (ورودی_خام)
  • input (ورودی)

تابع raw_input

تابع raw_input([prompt]) در پایتون، یک خط از ورودی را می‌خواند و آن را به صورت یک رشته به عنوان خروجی باز می‌گرداند.
 

str = raw_input("Enter your input: ")
print("Received input is : ", str)

 خروجی آن به شکل زیر است :

Enter your input: Hello Python
Received input is :  Hello Python

تابع input

تابع input([prompt]) با تابع raw_input تفاوت دارد. هر دو تابع ورودی از کاربر را دریافت می‌کنند، اما تابع input فرض می‌کند که ورودی یک عبارت معتبر در زبان پایتون است و این عبارت را تحلیل و اجرا می‌کند، سپس نتیجه تحلیل شده را به شما باز می‌گرداند. به عبارت دیگر، input ورودی را به عنوان یک عبارت پایتونی می‌پذیرد و خروجی اجرای آن عبارت را به شما می‌دهد. از سوی دیگر، raw_input ورودی را به صورت مستقیم به عنوان یک رشته باز می‌گرداند بدون هیچگونه تحلیل یا اجرای اسکریپت.
 

str = input("Enter your input: ")
print "Received input is : ", str

خروجی:

Enter your input: [x*5 for x in range(2,10,2)]
Recieved input is :  [10, 20, 30, 40]

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

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

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

تابع open

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

file object = open(file_name [, access_mode][, buffering])

در ادامه جزئیات پارامترها را بررسی خواهیم کرد:

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

    • حالت دسترسی (access mode) :حالت دسترسی (access mode) تعیین‌کننده حالتی است که فایل باید باز شود، مانند حالت خواندن، نوشتن، اضافه کردن و غیره. در جدول زیر، لیستی از مقادیر ممکن برای حالت دسترسی آورده شده است. این پارامتر اختیاری است و حالت دسترسی پیش‌فرض برای فایل‌ها حالت خواندن (r) است.

حالت دسترسی توضیحات
r خواندن فایل (پیش‌فرض)
w نوشتن در فایل و ایجاد فایل جدید اگر وجود نداشته باشد
x نوشتن در فایل و ایجاد فایل جدید اگر وجود نداشته باشد (مانند w)، اما باز نمی‌شود اگر فایل وجود داشته باشد
a اضافه کردن به فایل و ایجاد فایل جدید اگر وجود نداشته باشد
b حالت دودویی (binary)
t حالت متنی (text)
+ همزمان باز کردن برای خواندن و نوشتن
  • بافربندی : در صورتی که مقدار بافربندی را به صفر تنظیم نمایید، هیچ فعالیت بافربندی انجام نخواهد شد. اگر مقدار بافربندی را به یک تنظیم نمایید، در هنگام دسترسی به فایل، عملیات بافربندی اعمال خواهد شد. اگر مقدار بافربندی را به عنوان یک عدد صحیح بزرگتر از یک مشخص نمایید، عملیات بافربندی با ابعاد بافر مشخص شده انجام خواهد شد. در صورتی که مقدار را منفی تنظیم کنید، ابعاد بافر به اندازه پیش‌فرض سیستم تعیین خواهد شد (رفتار پیش‌فرض).
     در ادامه، لیستی از حالت‌های مختلف باز کردن یک فایل آمده است −

شماره حالت‌ها و توضیحات
۱

خواندن (r)

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

۲

خواندن باینری (rb)

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

۳

خواندن و نوشتن (r+)

فایل به منظور همزمان خواندن و نوشتن باز می‌شود و نشانگر فایل ،در ابتدای فایل قرار می‌گیرد.
 

۴

خواندن و نوشتن باینری (rb+)

فایل به منظور همزمان خواندن و نوشتن در فرمت باینری باز می‌شود و نشانگر فایل ،در ابتدای فایل قرار می‌گیرد.

۵

نوشتن (w)

فایل به منظور فقط نوشتن باز می‌شود. در صورتی که فایل وجود داشته باشد، محتویات فایل بازنویسی می‌شود؛ و در صورتی که فایل وجود نداشته باشد، یک فایل جدید برای نوشتن ایجاد می‌شود.

۶

نوشتن باینری (wb)

فایل به منظور فقط نوشتن در فرمت باینری باز می‌شود. در صورتی که فایل وجود داشته باشد، محتویات فایل بازنویسی می‌شود؛ و در صورتی که فایل وجود نداشته باشد، یک فایل جدید در فرمت باینری برای نوشتن ایجاد می‌شود.
 

۷

نوشتن و خواندن (w+)

فایل به منظور همزمان نوشتن و خواندن باز می‌شود. در صورتی که فایل وجود داشته باشد، محتویات فایل بازنویسی می‌شود؛ و در صورتی که فایل وجود نداشته باشد، یک فایل جدید برای خواندن و نوشتن ایجاد می‌شود.

۸

نوشتن و خواندن باینری (wb+)

فایل به منظور همزمان نوشتن و خواندن در فرمت باینری باز می‌شود. در صورتی که فایل وجود داشته باشد، محتویات فایل بازنویسی می‌شود؛ و در صورتی که فایل وجود نداشته باشد، یک فایل جدید در فرمت باینری برای خواندن و نوشتن ایجاد می‌شود.
 

۹

الحاق (a)

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

۱۰

الحاق باینری (ab)

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

۱۱

الحاق و خواندن (a+)

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

۱۲

الحاق و خواندن باینری (ab+)

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

ویژگی‌های ابجکت file

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

شماره سریال ویژگی و توضیحات
۱

file.closed

 وقتی یک فایل باز شده بسته شود، مقدار true برگردانده می‌شود، و در صورتی که فایل باز باشد، مقدار false برگردانده می‌شود. این ویژگی به شما اجازه می‌دهد تا بررسی کنید که آیا فایل هنوز باز است یا نه.

۲

file.mode

وقتی یک فایل باز شده است، می‌توانید با استفاده از ویژگی mode اطلاعات حالت دسترسی که با آن فایل باز شده است را بدست آورید. ویژگی mode نشان‌دهنده حالتی است که برای باز کردن فایل تعیین شده است، مانند "r" برای خواندن، "w" برای نوشتن و "a" برای الحاق.

۳

file.name

وقتی یک فایل باز شده است، می‌توانید با استفاده از ویژگی name نام فایل را بدست آورید.

۴

file.softspace

ویژگی `file.softspace` در زبان برنامه‌نویسی Python  نسخه های بالا وجود ندارد و در واقع از نسخه‌ی 3.x به بعد از این ویژگی صرف‌نظر شده است. ویژگی `softspace` در نسخه‌های قدیمی‌تر Python مربوط به اضافه کردن یک فضای خالی به انتهای خروجی `print` برای جلوگیری از خط‌های خالی در خروجی می‌باشد. اما از Python 3.0 به بعد، این ویژگی تغییر کرده و تأثیری بر روی `print` ندارد.

به طور کلی، اکثر برنامه‌نویسان از متدهای دیگر برای مدیریت و کنترل فضای خالی در خروجی `print` استفاده می‌کنند، مانند استفاده از توابع رشته‌ها مانند `()isspace` و مشابه آن‌ها.

مثال

# Open a file
fo = open("foo.txt", "wb")
print("Name of the file: ", fo.name)
print("Closed or not : ", fo.closed)
print("Opening mode : ", fo.mode)
print("Softspace flag : ", fo.softspace)

 نتیجه زیر را تولید می‌کند:

Name of the file:  foo.txt
Closed or not :  False
Opening mode :  wb
Softspace flag :  0

متد ()close

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

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

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

fileObject.close()

مثال

# Open a file
fo = open("foo.txt", "wb")
print("Name of the file: ", fo.name)

# Close opend file
fo.close()

این عمل موجب تولید نتیجه زیر می‌شود:

Name of the file:  foo.txt

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

ابجکت file در Python مجموعه‌ای از متدهای دسترسی به فایل‌ها را فراهم می‌کند تا عملیات خواندن و نوشتن فایل‌ها را آسان‌تر کند. دو متد اساسی برای انجام این عملیات عبارتند از()read و ()write که به شما امکان خواندن و نوشتن داده‌ها در یک فایل را می‌دهند.

متد ()write

در متد ()write یک رشته در یک فایل نوشته میشود و این به شما امکان می‌دهد متن و همچنین داده‌های دودویی را در فایل بنویسید.
توجه داشته باشید که متد ()write به طور پیش‌فرض یک کاراکتر خط جدید ('n\') به انتهای رشته اضافه نمی‌کند. اگر می‌خواهید یک خط جدید اضافه کنید، باید خودتان کاراکتر خط جدید را به رشته اضافه کنید. به عنوان مثال:

fileObject.write(string)

مثال

# Open a file
fo = open("foo.txt", "wb")
fo.write( "Python is a great language.\nYeah its great!!\n")

# Close opend file
fo.close()

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

Python is a great language.
Yeah its great!!

متد ()read

در متد ()read یک رشته از یک فایل خوانده می‌شود. این رشته می‌تواند شامل داده‌های متنی و همچنین داده‌های دودویی باشد. به عبارت دقیق‌تر، متد ()read داده‌ها را در قالب رشته برمی‌گرداند، اما شما می‌توانید این رشته را با توجه به نوع داده‌ها تفسیر کنید.

fileObject.read([count])

پارامتر count تعداد بایت‌هایی را که تابع read باید از فایل بخواند مشخص می‌کند. اگر پارامتر count مشخص نشده باشد، تابع read تا انتهای فایل را می‌خواند. اما اگر مقدار count مشخص شده باشد، تابع read تنها تعداد بایت‌های مشخص شده را می‌خواند.

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

مثال

بیایید یک فایل با نام foo.txt که در بالا ایجاد کرده‌ایم را بخوانیم

# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10);
print "Read String is : ", str
# Close opend file
fo.close()

 نتیجه ی کد زیر:

Read String is :  Python is

موقعیت فایل

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

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

# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10)
print "Read String is : ", str

# Check current position
position = fo.tell()
print "Current file position : ", position

# Reposition pointer at the beginning once again
position = fo.seek(0, 0);
str = fo.read(10)
print "Again read String is : ", str
# Close opend file
fo.close()

این عبارت به نتیجه زیر منجر می‌شود :

Read String is :  Python is
Current file position :  10
Again read String is :  Python is

تغییر نام و حذف فایل‌ها

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

برای استفاده از ماژول os، ابتدا آن را وارد کنید:

متد ()rename

متد() rename دو آرگومان، نام فایل فعلی و نام فایل جدید را می‌گیرد.

os.rename(current_file_name, new_file_name)

مثال

در زیر مثالی برای تغییر نام یک فایل موجود به نام test1.txt آورده شده است :

import os

# Rename a file from test1.txt to test2.txt
os.rename( "test1.txt", "test2.txt" )

متد ()remove

شما می‌توانید از متد() remove برای حذف فایل‌ها با ارسال نام فایل به عنوان آرگومان استفاده کنید.

os.remove(file_name)

مثال

در زیر مثالی برای حذف یک فایل موجود با نام test2.txt آورده شده است −

import os

# Delete file test2.txt
os.remove("text2.txt")

دایرکتوری‌ها در پایتون

ماژول os در Python توابع و متدهای مختلفی را برای ایجاد، حذف، تغییر دایرکتوری‌ها و مدیریت مسیرها (paths) فراهم می‌کند. این توابع به شما امکان می‌دهند با دایرکتوری‌ها و مسیرها به صورت کامل کار کنید، از جمله ساخت دایرکتوری‌های جدید، حذف دایرکتوری‌ها و مسیرها، جلوگیری از ایجاد دوباره، ایجاد مسیرها و غیره.

متد() mkdir

شما می‌توانید از متد() mkdir ماژول os برای ایجاد دایرکتوری‌ها در دایرکتوری فعلی استفاده کنید. فقط کافیست به این متد یک آرگومان بدهید که شامل نام دایرکتوری مورد نظر برای ایجاد است.

os.mkdir("newdir")

مثال

در زیر مثالی برای ایجاد یک دایرکتوری به نام test در دایرکتوری فعلی آمده است:

import os

# Create a directory "test"
os.mkdir("test")

متد ()chdir

می‌توانید از متد() chdir برای تغییر دایرکتوری فعلی استفاده کنید. این متد یک آرگومان می‌پذیرد که نام دایرکتوری مورد نظر برای تغییر به آن را مشخص می‌کند.

os.chdir("newdir")

مثال

مثال زیر نشان می‌دهد چگونه به دایرکتوری "/home/newdir" وارد شویم −

import os

# Changing a directory to "/home/newdir"
os.chdir("/home/newdir")

متد ()getcwd

متد()getcwd مسیر کاری فعلی را نشان می‌دهد.

os.getcwd()

مثال

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

import os

# This would give location of the current directory
os.getcwd()

متد ()rmdir

متد()rmdir دایرکتوری را که به عنوان آرگومان به متد داده می‌شود، حذف می‌کند.

قبل از حذف یک دایرکتوری، باید تمام محتویات داخل آن حذف شوند.

os.rmdir('dirname')

مثال

در ادامه نمونه‌ای برای حذف دایرکتوری "/tmp/test" آورده شده است. لازم است نام کامل دایرکتوری را بدهید؛ در غیر اینصورت، در محل کنونی دایرکتوری را جستجو خواهد کرد.

import os

# This would  remove "/tmp/test"  directory.
os.rmdir( "/tmp/test"  )