در پایتون، بلاک try-except برای مدیریت استثناءها (خطاها) استفاده میشود.
▫️ بلاک try: این بلاک به شما امکان میدهد یک بلاک کد را برای بررسی خطاها تست کنید. در این بلاک، قسمتی از کد که ممکن است خطا ایجاد کند قرار میگیرد.
▫️ بلاک except: این بلاک به شما امکان میدهد خطاها را مدیریت کنید. وقتی یک خطا در بلاک try رخ میدهد، کنترل به بلاک except منتقل میشود و کد موجود در این بلاک اجرا میشود.
▫️ بلاک else: این بلاک به شما امکان میدهد کدی را اجرا کنید که در صورت عدم وجود خطا در بلاک try قرار دارد. به عبارت دیگر، اگر هیچ خطایی در بلاک try رخ ندهد، بلاک else اجرا میشود.
▫️ بلاک finally: این بلاک به شما امکان میدهد کدی را اجرا کنید که باید در هر صورت، بعد از اجرای بلاک try و except، اجرا شود. بدون توجه به وجود یا عدم وجود خطا، بلاک finally همیشه اجرا میشود.
این بلاکها در مجموعهای از کدها استفاده میشوند تا کنترل برنامه در مواقعی که خطا رخ میدهد، به دست بگیرد و اقدامات مناسب برای مدیریت خطا انجام شود.
▫️ بلاک try: این بلاک به شما امکان میدهد یک بلاک کد را برای بررسی خطاها تست کنید. در این بلاک، قسمتی از کد که ممکن است خطا ایجاد کند قرار میگیرد.
▫️ بلاک except: این بلاک به شما امکان میدهد خطاها را مدیریت کنید. وقتی یک خطا در بلاک try رخ میدهد، کنترل به بلاک except منتقل میشود و کد موجود در این بلاک اجرا میشود.
▫️ بلاک else: این بلاک به شما امکان میدهد کدی را اجرا کنید که در صورت عدم وجود خطا در بلاک try قرار دارد. به عبارت دیگر، اگر هیچ خطایی در بلاک try رخ ندهد، بلاک else اجرا میشود.
▫️ بلاک finally: این بلاک به شما امکان میدهد کدی را اجرا کنید که باید در هر صورت، بعد از اجرای بلاک try و except، اجرا شود. بدون توجه به وجود یا عدم وجود خطا، بلاک finally همیشه اجرا میشود.
این بلاکها در مجموعهای از کدها استفاده میشوند تا کنترل برنامه در مواقعی که خطا رخ میدهد، به دست بگیرد و اقدامات مناسب برای مدیریت خطا انجام شود.
در پایتون وقتی خطایی رخ میدهد، یک استثنا (exception) ایجاد میشود که معمولا باعث متوقف شدن برنامه میشود.
ما میتوانیم استثناها را با استفاده از دستور try-except هندل کنیم:
خروجی:
در این مثال، دستور print(x) در بلوک try یک استثنا ایجاد میکند چون x تعریف نشده است. در نتیجه بلوک except اجرا میشود و پیام "An exception occurred" چاپ میکند.
با استفاده از دستور try-except ما میتوانیم استثناها را بگیریم و رفتار مناسبی برای هندل کردن آنها تعریف کنیم تا برنامه متوقف نشود.
ما میتوانیم استثناها را با استفاده از دستور try-except هندل کنیم:
try:
print(x)
except:
print("An exception occurred")
خروجی:
An exception occurred
در این مثال، دستور print(x) در بلوک try یک استثنا ایجاد میکند چون x تعریف نشده است. در نتیجه بلوک except اجرا میشود و پیام "An exception occurred" چاپ میکند.
با استفاده از دستور try-except ما میتوانیم استثناها را بگیریم و رفتار مناسبی برای هندل کردن آنها تعریف کنیم تا برنامه متوقف نشود.
بدون بلوک try-except، دستور print(x) مستقیماً یک خطا ایجاد میکند چون x تعریف نشده است:
خروجی:
همانطور که مشاهده میکنید، یک خطای NameError رخ میدهد چون متغیر x تعریف نشده است. این خطا باعث میشود برنامه متوقف شود.
اما اگر همین دستور را در بلوک try قرار دهیم، بلوک except اجرا میشود و پیام خطا را چاپ میکند. بنابراین ادامه برنامه اجرا میشود:
خروجی:
با استفاده از try-except میتوانیم خطاها را بگیریم و از خراب شدن برنامه جلوگیری کنیم.
print(x)
خروجی:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
همانطور که مشاهده میکنید، یک خطای NameError رخ میدهد چون متغیر x تعریف نشده است. این خطا باعث میشود برنامه متوقف شود.
اما اگر همین دستور را در بلوک try قرار دهیم، بلوک except اجرا میشود و پیام خطا را چاپ میکند. بنابراین ادامه برنامه اجرا میشود:
try:
print(x)
except:
print("An exception occurred")
خروجی:
An exception occurred
با استفاده از try-except میتوانیم خطاها را بگیریم و از خراب شدن برنامه جلوگیری کنیم.
میتوانیم بلاکهای except متعددی تعریف کنیم تا برای انواع خطاها، کدهای متفاوتی اجرا شود.
به عنوان مثال:
در این مثال دو بلاک except تعریف شده است:
- اگر خطای NameError رخ دهد، پیام "Variable x is not defined" چاپ میشود
- برای سایر خطاها، پیام "Something else went wrong" چاپ میشود
خروجی:
در اینجا چون خطای NameError رخ داده، بلاک اول except اجرا میشود.
به این ترتیب میتوانیم برای انواع خطاها، کدهای جداگانهای اجرا کنیم تا رفتار برنامه مناسبتر باشد.
به عنوان مثال:
try:
print(x)
except NameError:
print("Variable x is not defined")
except:
print("Something else went wrong")
در این مثال دو بلاک except تعریف شده است:
- اگر خطای NameError رخ دهد، پیام "Variable x is not defined" چاپ میشود
- برای سایر خطاها، پیام "Something else went wrong" چاپ میشود
خروجی:
Variable x is not defined
در اینجا چون خطای NameError رخ داده، بلاک اول except اجرا میشود.
به این ترتیب میتوانیم برای انواع خطاها، کدهای جداگانهای اجرا کنیم تا رفتار برنامه مناسبتر باشد.
میتوانیم از کلمهی else برای تعریف بلوکی از کد استفاده کنیم که اگر در بلوک try خطایی رخ نداد، اجرا شود
خروجی:
همچنین میتوانیم از بلوک finally استفاده کنیم که صرفنظر از بروز خطا در بلوک try، همیشه اجرا میشود
خروجی:
استفاده از finally مفید است برای بستن منابع و پاکسازی بعد از اتمام بلوک try-except.
مثلا در این مثال، فایل بعد از نوشتن یا خطا بسته میشود:
با استفاده از else و finally میتوانیم کنترل بیشتری روی برنامه در بلوکهای try-except داشته باشیم.
try:
print("Hello")
except:
print("Something went wrong")
else:
print("Nothing went wrong")
خروجی:
Hello
Nothing went wrong
همچنین میتوانیم از بلوک finally استفاده کنیم که صرفنظر از بروز خطا در بلوک try، همیشه اجرا میشود
try:
print(x)
except:
print("Something went wrong")
finally:
print("The 'try except' is finished")
خروجی:
Something went wrong
The 'try except' is finished
استفاده از finally مفید است برای بستن منابع و پاکسازی بعد از اتمام بلوک try-except.
مثلا در این مثال، فایل بعد از نوشتن یا خطا بسته میشود:
try:
f = open("demofile.txt")
try:
f.write("Lorum Ipsum")
except:
print("Something went wrong when writing to the file")
finally:
f.close()
except:
print("Something went wrong when opening the file")
با استفاده از else و finally میتوانیم کنترل بیشتری روی برنامه در بلوکهای try-except داشته باشیم.
میتوانیم با استفاده از کلمهی raise یک استثنا ایجاد کنیم
خروجی:
کلمهی raise باعث میشود یک استثنا ایجاد شود و برنامه متوقف شود.
همچنین میتوانیم نوع خطا و متن آن را مشخص کنیم:
خروجی:
با استفاده از raise میتوانیم در شرایط خاصی استثناهایی را ایجاد کنیم تا رفتار برنامه کنترل شود. این کار باعث میشود کد پاکتر و خطاها بهتر هندل شوند.
x = -1
if x < 0:
raise Exception("Sorry, no numbers below zero")
خروجی:
Exception: Sorry, no numbers below zero
کلمهی raise باعث میشود یک استثنا ایجاد شود و برنامه متوقف شود.
همچنین میتوانیم نوع خطا و متن آن را مشخص کنیم:
x = "hello"
if not type(x) is int:
raise TypeError("Only integers are allowed")
خروجی:
TypeError: Only integers are allowed
با استفاده از raise میتوانیم در شرایط خاصی استثناهایی را ایجاد کنیم تا رفتار برنامه کنترل شود. این کار باعث میشود کد پاکتر و خطاها بهتر هندل شوند.
میتوانیم از کاربر ورودی دریافت کنیم.
روش دریافت ورودی در پایتون 3.6 با 2.7 متفاوت است.
پایتون 3.6 از متد input() استفاده میکند.
پایتون 2.7 از متد raw_input() استفاده میکند.
مثال زیر ابتدا نام کاربری را درخواست میکند، سپس نام کاربری وارد شده را چاپ میکند:
پایتون 3.6
username = input("Enter username:")
print("Username is: " + username)
خروجی
Enter username:Alice
Username is: Alice
پایتون 2.7
username = raw_input("Enter username:")
print("Username is: " + username)
خروجی
Enter username:Bob
Username is: Bob
پایتون زمانی که به تابع input() میرسد متوقف میشود تا کاربر ورودی بدهد، سپس پس از دریافت ورودی اجرا را ادامه میدهد.
روش دریافت ورودی در پایتون 3.6 با 2.7 متفاوت است.
پایتون 3.6 از متد input() استفاده میکند.
پایتون 2.7 از متد raw_input() استفاده میکند.
مثال زیر ابتدا نام کاربری را درخواست میکند، سپس نام کاربری وارد شده را چاپ میکند:
پایتون 3.6
username = input("Enter username:")
print("Username is: " + username)
خروجی
Enter username:Alice
Username is: Alice
پایتون 2.7
username = raw_input("Enter username:")
print("Username is: " + username)
خروجی
Enter username:Bob
Username is: Bob
پایتون زمانی که به تابع input() میرسد متوقف میشود تا کاربر ورودی بدهد، سپس پس از دریافت ورودی اجرا را ادامه میدهد.
برای اطمینان از نمایش درست یک رشته، میتوانیم خروجی را با استفاده از متد format() فرمت کنیم.
فرمت کردن رشته با format()
متد format() به ما اجازه میدهد بخشهای مشخصی از یک رشته را فرمت کنیم.
گاهی اوقات بخشهایی از متن وجود دارد که کنترل آن در دست ما نیست، مثلا از پایگاه داده یا ورودی کاربر آمده باشند.
برای کنترل این مقادیر، میتوان نگهدارنده های مکان (آکولاد {}) در متن اضافه کرد و مقادیر را از طریق متد format() عبور داد:
مثال
price = 49
txt = "The price is {} dollars"
print(txt.format(price))
خروجی:
The price is 49 dollars
میتوان پارامترهایی درون آکولادها مشخص کرد تا نحوه تبدیل مقدار را تعیین کنیم:
مثال
price = 49
txt = "The price is {:.2f} dollars"
print(txt.format(price))
خروجی:
The price is 49.00 dollars
فرمت کردن رشته با format()
متد format() به ما اجازه میدهد بخشهای مشخصی از یک رشته را فرمت کنیم.
گاهی اوقات بخشهایی از متن وجود دارد که کنترل آن در دست ما نیست، مثلا از پایگاه داده یا ورودی کاربر آمده باشند.
برای کنترل این مقادیر، میتوان نگهدارنده های مکان (آکولاد {}) در متن اضافه کرد و مقادیر را از طریق متد format() عبور داد:
مثال
price = 49
txt = "The price is {} dollars"
print(txt.format(price))
خروجی:
The price is 49 dollars
میتوان پارامترهایی درون آکولادها مشخص کرد تا نحوه تبدیل مقدار را تعیین کنیم:
مثال
price = 49
txt = "The price is {:.2f} dollars"
print(txt.format(price))
خروجی:
The price is 49.00 dollars
مقادیر چندگانه
اگر بخواهیم از مقادیر بیشتری استفاده کنیم، کافی است مقادیر بیشتری را به متد format() بدهیم:
print(txt.format(price, itemno, count))
و نگهدارنده مکان بیشتری اضافه کنیم:
مثال
quantity = 3
itemno = 567
price = 49
myorder = "I want {} pieces of item number {} for {:.2f} dollars."
print(myorder.format(quantity, itemno, price))
خروجی:
I want 3 pieces of item number 567 for 49.00 dollars.
پس با اضافه کردن مقادیر بیشتر به متد format() و آکولاد بیشتر، میتوان مقادیر متعددی را در رشته جایگذاری کرد.
اگر بخواهیم از مقادیر بیشتری استفاده کنیم، کافی است مقادیر بیشتری را به متد format() بدهیم:
print(txt.format(price, itemno, count))
و نگهدارنده مکان بیشتری اضافه کنیم:
مثال
quantity = 3
itemno = 567
price = 49
myorder = "I want {} pieces of item number {} for {:.2f} dollars."
print(myorder.format(quantity, itemno, price))
خروجی:
I want 3 pieces of item number 567 for 49.00 dollars.
پس با اضافه کردن مقادیر بیشتر به متد format() و آکولاد بیشتر، میتوان مقادیر متعددی را در رشته جایگذاری کرد.
میتوان از شمارههای اندیس (عدد داخل آکولاد {0}) برای اطمینان از قرار گرفتن مقادیر در جای درست استفاده کرد
مثال
quantity = 3
itemno = 567
price = 49
myorder = "I want {0} pieces of item number {1} for {2:.2f} dollars."
print(myorder.format(quantity, itemno, price))
خروجی:
I want 3 pieces of item number 567 for 49.00 dollars.
همچنین اگر بخواهیم به یک مقدار بیش از یکبار ارجاع دهیم، از شماره اندیس استفاده میکنیم:
مثال
age = 36
name = "John"
txt = "His name is {1}. {1} is {0} years old."
print(txt.format(age, name))
خروجی:
His name is John. John is 36 years old.
پس با شمارههای اندیس میتوانیم مطمئن شویم که مقادیر در جای درست قرار میگیرند.
مثال
quantity = 3
itemno = 567
price = 49
myorder = "I want {0} pieces of item number {1} for {2:.2f} dollars."
print(myorder.format(quantity, itemno, price))
خروجی:
I want 3 pieces of item number 567 for 49.00 dollars.
همچنین اگر بخواهیم به یک مقدار بیش از یکبار ارجاع دهیم، از شماره اندیس استفاده میکنیم:
مثال
age = 36
name = "John"
txt = "His name is {1}. {1} is {0} years old."
print(txt.format(age, name))
خروجی:
His name is John. John is 36 years old.
پس با شمارههای اندیس میتوانیم مطمئن شویم که مقادیر در جای درست قرار میگیرند.
شاخص های نامگذاری شده
میتوان از نامهای اندیس استفاده کرد، با وارد کردن یک نام داخل آکولادها {carname}، اما در این صورت باید هنگام پاس دادن مقادیر پارامتر از نامها استفاده کرد:
txt.format(carname="Ford")
مثال
myorder = "I have a {carname}, it is a {model}."
print(myorder.format(carname = "Ford", model = "Mustang"))
خروجی
I have a Ford, it is a Mustang.
پس میتوان با استفاده از نامهای اندیس ها ، به جای شمارههای اندیس ها، مقادیر را اختصاص داد.
میتوان از نامهای اندیس استفاده کرد، با وارد کردن یک نام داخل آکولادها {carname}، اما در این صورت باید هنگام پاس دادن مقادیر پارامتر از نامها استفاده کرد:
txt.format(carname="Ford")
مثال
myorder = "I have a {carname}, it is a {model}."
print(myorder.format(carname = "Ford", model = "Mustang"))
خروجی
I have a Ford, it is a Mustang.
پس میتوان با استفاده از نامهای اندیس ها ، به جای شمارههای اندیس ها، مقادیر را اختصاص داد.
🔰 باز کردن فایل یکی از مهمترین بخش های برنامه نویسی پایتون است.
برای باز کردن فایل در پایتون از تابع open() استفاده میکنیم.
این تابع دو پارامتر دارد:
🟡 نام فایل - نام فایلی که میخواهیم باز کنیم
🟡 حالت - مشخص میکند فایل را به چه صورتی باز کنیم. چهار حالت وجود دارد:
⚫️ "r"
- فقط خواندن. پیش فرض است. اگر فایل وجود نداشته باشد خطا میدهد.
⚫️ "a"
- اضافه کردن. به انتهای فایل اضافه میکند. اگر فایل وجود نداشت یکی جدید میسازد.
⚫️ "w"
- نوشتن. فایل را برای نوشتن باز میکند. اگر فایل وجود داشته باشد جایگزین میشود.
⚫️ "x"
- ایجاد فایل جدید. اگر فایل وجود داشته باشد خطا میدهد.
همچنین میتوان مشخص کرد فایل به صورت متن یا باینری باز شود:
⚪️ "t"
- متن. پیش فرض است.
⚪️ "b"
- باینری. مثلا برای عکس ها.
خلاصه اینکه تابع open() امکانات زیادی برای باز کردن، خواندن، نوشتن و اضافه کردن به فایل ها در پایتون فراهم میکند.
🧩🧩🧩🧩🧩🧩🧩🧩🧩🧩🧩🧩🧩
⭕️ نحوه استفاده
برای باز کردن یک فایل برای خواندن، فقط کافی است نام فایل را مشخص کنیم:
f = open("demofile.txt")
کد بالا معادل است با:
f = open("demofile.txt", "rt")
چون "r" به معنای خواندن و "t" به معنای متن هستند که مقادیر پیشفرض هستند، نیازی به مشخص کردن آنها نیست.
🔴 مطمئن شوید فایل وجود دارد، در غیر این صورت خطایی رخ میدهد.
برای باز کردن فایل در پایتون از تابع open() استفاده میکنیم.
این تابع دو پارامتر دارد:
🟡 نام فایل - نام فایلی که میخواهیم باز کنیم
🟡 حالت - مشخص میکند فایل را به چه صورتی باز کنیم. چهار حالت وجود دارد:
⚫️ "r"
- فقط خواندن. پیش فرض است. اگر فایل وجود نداشته باشد خطا میدهد.
⚫️ "a"
- اضافه کردن. به انتهای فایل اضافه میکند. اگر فایل وجود نداشت یکی جدید میسازد.
⚫️ "w"
- نوشتن. فایل را برای نوشتن باز میکند. اگر فایل وجود داشته باشد جایگزین میشود.
⚫️ "x"
- ایجاد فایل جدید. اگر فایل وجود داشته باشد خطا میدهد.
همچنین میتوان مشخص کرد فایل به صورت متن یا باینری باز شود:
⚪️ "t"
- متن. پیش فرض است.
⚪️ "b"
- باینری. مثلا برای عکس ها.
خلاصه اینکه تابع open() امکانات زیادی برای باز کردن، خواندن، نوشتن و اضافه کردن به فایل ها در پایتون فراهم میکند.
🧩🧩🧩🧩🧩🧩🧩🧩🧩🧩🧩🧩🧩
⭕️ نحوه استفاده
برای باز کردن یک فایل برای خواندن، فقط کافی است نام فایل را مشخص کنیم:
f = open("demofile.txt")
کد بالا معادل است با:
f = open("demofile.txt", "rt")
چون "r" به معنای خواندن و "t" به معنای متن هستند که مقادیر پیشفرض هستند، نیازی به مشخص کردن آنها نیست.
🔴 مطمئن شوید فایل وجود دارد، در غیر این صورت خطایی رخ میدهد.
🟣 در پایتون برای باز کردن یک فایل از تابع داخلی open() استفاده میکنیم.
این تابع یک شیء فایل برمیگرداند که دارای روش read() برای خواندن محتوای فایل است:
مثال:
f = open("demofile.txt", "r")
print(f.read())
نتیجه:
Hello! Welcome to demofile.txt
This file is for testing purposes.
Good Luck!
🟪 اگر فایل در مسیر دیگری قرار دارد، باید مسیر کامل فایل را مشخص کنیم:
مثال:
f = open("D:\\myfiles\\welcome.txt", "r")
print(f.read())
نتیجه:
Welcome to this text file!
This file is located in a folder named "myfiles", on the D drive.
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!
🟪 اگر فایل در مسیر دیگری قرار دارد، باید مسیر کامل فایل را مشخص کنیم:
مثال:
f = open("D:\\myfiles\\welcome.txt", "r")
print(f.read())
نتیجه:
Welcome to this text file!
This file is located in a folder named "myfiles", on the D drive.
Good Luck!
بنابراین با استفاده از تابع open() و مشخص کردن مسیر فایل، میتوانیم فایلها را در پایتون باز کنیم و محتوای آنها را بخوانیم.
بطور پیشفرض، متد read() تمام متن را برمیگرداند. اما شما همچنین میتوانید تعیین کنید چند کاراکتر را میخواهید برگردانید.
مثال:
این کد، 5 کاراکتر اول فایل را برمیگرداند.
نتیجه :
Hello
مثال:
f = open("demofile.txt", "r")
print(f.read(5))
این کد، 5 کاراکتر اول فایل را برمیگرداند.
نتیجه :
Hello
روش های مختلف خواندن خط به خط یک فایل
💢 مثال اول:
f = open("demofile.txt", "r")
باز کردن فایل با نام demofile.txt برای خواندن
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.
🕳🕳🕳🕳🕳🕳🕳🕳🕳🕳🕳
💢 مثال سوم:
f = open("demofile.txt", "r")
باز کردن فایل
for x in f:
print(x)
حلقه بر روی خطوط فایل برای خواندن و چاپ تک تک آنها
➡️
Hello! Welcome to demofile.txt
This file is for testing purposes.
Good Luck!
به طور خلاصه، readline() برای خواندن خط به خط، for loop برای خواندن کل فایل، و open() برای باز کردن فایل استفاده میشود
💢 مثال اول:
f = open("demofile.txt", "r")
باز کردن فایل با نام demofile.txt برای خواندن
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.
🕳🕳🕳🕳🕳🕳🕳🕳🕳🕳🕳
💢 مثال سوم:
f = open("demofile.txt", "r")
باز کردن فایل
for x in f:
print(x)
حلقه بر روی خطوط فایل برای خواندن و چاپ تک تک آنها
➡️
Hello! Welcome to demofile.txt
This file is for testing purposes.
Good Luck!
به طور خلاصه، readline() برای خواندن خط به خط، for loop برای خواندن کل فایل، و open() برای باز کردن فایل استفاده میشود