“`html
ورودی و خروجی در پایتون: چیت شیت کاربردی
پایتون، زبانی قدرتمند و همهکاره، ابزارهای متنوعی برای مدیریت ورودی و خروجی (I/O) در اختیار توسعهدهندگان قرار میدهد. این ابزارها، از دریافت داده از کاربر گرفته تا خواندن و نوشتن فایلها، نقش حیاتی در تعامل برنامهها با دنیای خارج ایفا میکنند. در این چیتشیت جامع، به بررسی عمیق مفاهیم و تکنیکهای ورودی و خروجی در پایتون میپردازیم و نکات کلیدی و بهترین شیوهها را برای استفاده بهینه از این قابلیتها ارائه خواهیم کرد.
1. ورودی گرفتن از کاربر با `input()`
تابع `input()` سادهترین راه برای دریافت ورودی از کاربر در پایتون است. این تابع یک رشته (string) را به عنوان آرگومان دریافت میکند که به عنوان پیام提示 (prompt) به کاربر نمایش داده میشود. کاربر میتواند متن مورد نظر خود را وارد کرده و با فشردن کلید Enter، آن را به برنامه ارسال کند. مقدار بازگشتی تابع `input()` همواره یک رشته است، حتی اگر کاربر عدد وارد کند.
name = input("لطفاً نام خود را وارد کنید: ")
print("سلام، " + name + "!")
age = input("لطفاً سن خود را وارد کنید: ")
age = int(age) # تبدیل رشته به عدد صحیح
print("شما " + str(age) + " سال دارید.")
نکات کلیدی در استفاده از `input()`:
- همیشه مقدار بازگشتی `input()` یک رشته است.
- برای تبدیل رشته به انواع دادهای دیگر (مانند عدد صحیح یا اعشاری)، از توابع `int()`، `float()` و غیره استفاده کنید.
- برای مدیریت خطاهای احتمالی ناشی از تبدیل دادهها، از بلوکهای `try…except` استفاده کنید.
1.1. مدیریت خطا با `try…except`
هنگامی که قصد دارید رشتهای را به عدد تبدیل کنید، ممکن است کاربر ورودی نامعتبر (مانند متن به جای عدد) وارد کند. در این صورت، پایتون یک استثناء (exception) از نوع `ValueError` ایجاد میکند. برای جلوگیری از توقف برنامه در صورت بروز چنین خطایی، میتوانید از بلوک `try…except` استفاده کنید:
try:
age = input("لطفاً سن خود را وارد کنید: ")
age = int(age)
print("شما " + str(age) + " سال دارید.")
except ValueError:
print("ورودی نامعتبر است. لطفاً یک عدد صحیح وارد کنید.")
در این مثال، اگر کاربر ورودی نامعتبر وارد کند، بلوک `except ValueError` اجرا شده و پیام خطای مناسب به کاربر نمایش داده میشود.
1.2. ورودی چندگانه
گاهی اوقات نیاز دارید که در یک خط، چندین ورودی از کاربر دریافت کنید. برای این کار میتوانید از تابع `input()` به همراه متد `split()` استفاده کنید. متد `split()` رشته را بر اساس یک جداکننده (delimiter) به یک لیست از زیررشتهها تبدیل میکند. جداکننده پیشفرض، فضای خالی است.
x, y = input("لطفاً دو عدد را با فاصله وارد کنید: ").split()
x = int(x)
y = int(y)
print("حاصل جمع دو عدد: " + str(x + y))
در این مثال، کاربر باید دو عدد را با یک فاصله از هم جدا کرده و وارد کند. متد `split()` رشته ورودی را به یک لیست دو عضوی تبدیل میکند که سپس به متغیرهای `x` و `y` اختصاص داده میشوند.
2. خروجی دادن با `print()`
تابع `print()` پرکاربردترین راه برای نمایش خروجی در پایتون است. این تابع میتواند یک یا چند آرگومان را دریافت کرده و مقادیر آنها را در خروجی چاپ کند. به طور پیشفرض، مقادیر با یک فاصله از هم جدا شده و در انتهای خروجی یک خط جدید (newline) اضافه میشود.
print("سلام، دنیا!")
print(1, 2, 3)
print("نام:", "علی", "سن:", 30)
نکات کلیدی در استفاده از `print()`:
- آرگومانهای `print()` میتوانند از انواع دادهای مختلف باشند.
- به طور پیشفرض، مقادیر با یک فاصله از هم جدا میشوند.
- به طور پیشفرض، یک خط جدید در انتهای خروجی اضافه میشود.
2.1. تغییر جداکننده و پایاندهنده
میتوانید با استفاده از آرگومانهای `sep` و `end`، رفتار پیشفرض `print()` را تغییر دهید. آرگومان `sep` جداکنندهای را مشخص میکند که بین مقادیر قرار میگیرد و آرگومان `end` رشتهای را مشخص میکند که در انتهای خروجی اضافه میشود.
print("نام:", "علی", "سن:", 30, sep="-", end="!\n")
# خروجی: نام:-علی-سن:-30!
در این مثال، از خط تیره (-) به عنوان جداکننده و از علامت تعجب (!) به همراه خط جدید (\n) به عنوان پایاندهنده استفاده شده است.
2.2. قالببندی رشتهها
برای نمایش خروجی به صورت مرتب و خوانا، میتوانید از روشهای قالببندی رشتهها استفاده کنید. پایتون سه روش اصلی برای قالببندی رشتهها ارائه میدهد:
- قالببندی با استفاده از عملگر %: این روش قدیمیتر است و تا حدودی پیچیده است.
- قالببندی با استفاده از متد `format()`: این روش جدیدتر و انعطافپذیرتر است.
- رشتههای f-string (از پایتون 3.6 به بعد): این روش سادهترین و خواناترین روش است.
مثال با استفاده از عملگر %:
name = "علی"
age = 30
print("نام: %s، سن: %d" % (name, age))
مثال با استفاده از متد `format()`:
name = "علی"
age = 30
print("نام: {}, سن: {}".format(name, age))
print("نام: {1}, سن: {0}".format(age, name)) # تعیین ترتیب
print("نام: {n}, سن: {a}".format(n=name, a=age)) # استفاده از نام متغیرها
مثال با استفاده از f-string:
name = "علی"
age = 30
print(f"نام: {name}, سن: {age}")
print(f"سن شما در 10 سال آینده: {age + 10}")
f-stringها به دلیل سادگی و خوانایی، روش توصیه شده برای قالببندی رشتهها در پایتون 3.6 و نسخههای بعد از آن هستند.
3. خواندن و نوشتن فایلها
پایتون ابزارهای قدرتمندی برای خواندن و نوشتن فایلها در اختیار شما قرار میدهد. برای کار با فایلها، ابتدا باید فایل را باز کنید و سپس عملیات مورد نظر (خواندن یا نوشتن) را انجام دهید. در نهایت، باید فایل را ببندید تا منابع سیستم آزاد شوند.
# باز کردن فایل برای نوشتن (اگر فایل وجود نداشته باشد، ایجاد میشود)
file = open("myfile.txt", "w")
# نوشتن در فایل
file.write("این یک خط متن است.\n")
file.write("این خط دوم است.\n")
# بستن فایل
file.close()
# باز کردن فایل برای خواندن
file = open("myfile.txt", "r")
# خواندن تمام محتویات فایل
content = file.read()
print(content)
# بستن فایل
file.close()
حالتهای باز کردن فایل:
- `”r”`: خواندن (خواندن از ابتدای فایل، خطا اگر فایل وجود نداشته باشد).
- `”w”`: نوشتن (نوشتن از ابتدای فایل، اگر فایل وجود نداشته باشد ایجاد میشود، محتویات قبلی حذف میشوند).
- `”a”`: افزودن (نوشتن در انتهای فایل، اگر فایل وجود نداشته باشد ایجاد میشود).
- `”x”`: ایجاد (ایجاد فایل جدید، خطا اگر فایل وجود داشته باشد).
- `”b”`: حالت باینری (برای کار با فایلهای باینری).
- `”t”`: حالت متنی (حالت پیشفرض، برای کار با فایلهای متنی).
- `”+”`: به روز رسانی (خواندن و نوشتن).
نکات کلیدی در کار با فایلها:
- همیشه بعد از اتمام کار با فایل، آن را ببندید.
- برای جلوگیری از بروز خطا در صورت فراموش کردن بستن فایل، از عبارت `with` استفاده کنید.
- از حالت مناسب برای باز کردن فایل استفاده کنید (خواندن، نوشتن، افزودن، و غیره).
- برای کار با فایلهای باینری، از حالت `”b”` استفاده کنید.
3.1. استفاده از `with` برای مدیریت فایل
عبارت `with` یک راه امنتر و مطمئنتر برای کار با فایلها فراهم میکند. هنگامی که از `with` استفاده میکنید، پایتون به طور خودکار فایل را پس از اتمام کار میبندد، حتی اگر در حین کار با فایل خطایی رخ دهد.
with open("myfile.txt", "r") as file:
content = file.read()
print(content)
# فایل به طور خودکار بسته میشود
استفاده از `with` به شدت توصیه میشود، زیرا از بروز خطاهای ناشی از فراموش کردن بستن فایل جلوگیری میکند.
3.2. خواندن خط به خط فایل
گاهی اوقات نیاز دارید که فایل را خط به خط بخوانید. برای این کار میتوانید از متد `readline()` یا از یک حلقه `for` استفاده کنید.
# خواندن با استفاده از readline()
with open("myfile.txt", "r") as file:
line1 = file.readline()
line2 = file.readline()
print(line1)
print(line2)
# خواندن با استفاده از حلقه for
with open("myfile.txt", "r") as file:
for line in file:
print(line, end="") # جلوگیری از چاپ خط جدید اضافی
در روش دوم، هر خط از فایل به عنوان یک عنصر در حلقه `for` قرار میگیرد. توجه داشته باشید که متد `readline()` خط جدید (\n) را در انتهای خط حفظ میکند. برای جلوگیری از چاپ خط جدید اضافی، میتوانید از آرگومان `end=””` در تابع `print()` استفاده کنید.
3.3. نوشتن چند خط در فایل
برای نوشتن چند خط در فایل، میتوانید از متد `writelines()` استفاده کنید. این متد یک لیست از رشتهها را به عنوان آرگومان دریافت میکند و هر رشته را در یک خط جداگانه در فایل مینویسد.
lines = ["این خط اول است.\n", "این خط دوم است.\n", "این خط سوم است.\n"]
with open("myfile.txt", "w") as file:
file.writelines(lines)
4. کار با فایلهای CSV
فایلهای CSV (Comma Separated Values) یک فرمت رایج برای ذخیره دادههای جدولی هستند. پایتون کتابخانه `csv` را برای کار با این نوع فایلها ارائه میدهد.
import csv
# نوشتن در فایل CSV
with open("data.csv", "w", newline="") as file:
writer = csv.writer(file)
writer.writerow(["نام", "سن", "شهر"])
writer.writerow(["علی", "30", "تهران"])
writer.writerow(["رضا", "25", "اصفهان"])
# خواندن از فایل CSV
with open("data.csv", "r") as file:
reader = csv.reader(file)
for row in reader:
print(row)
نکات کلیدی در کار با فایلهای CSV:
- برای جلوگیری از ایجاد خطوط خالی بین ردیفها در هنگام نوشتن، از آرگومان `newline=””` در تابع `open()` استفاده کنید.
- کتابخانه `csv` توابع مختلفی برای خواندن و نوشتن فایلهای CSV با فرمتهای مختلف ارائه میدهد.
5. سریالسازی و غیرسریالسازی با `pickle`
کتابخانه `pickle` به شما امکان میدهد تا اشیاء پایتون را به صورت باینری در فایل ذخیره کنید و سپس آنها را از فایل بازیابی کنید. این فرآیند به ترتیب سریالسازی (serialization) و غیرسریالسازی (deserialization) نامیده میشود.
import pickle
# سریالسازی
data = {"نام": "علی", "سن": 30, "شهر": "تهران"}
with open("data.pickle", "wb") as file:
pickle.dump(data, file)
# غیرسریالسازی
with open("data.pickle", "rb") as file:
loaded_data = pickle.load(file)
print(loaded_data)
نکات کلیدی در استفاده از `pickle`:
- `pickle` برای ذخیره و بازیابی اشیاء پایتون استفاده میشود.
- برای سریالسازی، از متد `dump()` و برای غیرسریالسازی، از متد `load()` استفاده کنید.
- فایل را در حالت باینری (`”wb”` برای نوشتن و `”rb”` برای خواندن) باز کنید.
- از `pickle` برای ذخیره دادههای حساس استفاده نکنید، زیرا امنیت کافی را فراهم نمیکند.
6. استفاده از `json` برای کار با دادههای JSON
JSON (JavaScript Object Notation) یک فرمت رایج برای تبادل دادهها بین برنامهها است. کتابخانه `json` در پایتون به شما امکان میدهد تا دادههای JSON را بخوانید و بنویسید.
import json
# نوشتن در فایل JSON
data = {"نام": "علی", "سن": 30, "شهر": "تهران"}
with open("data.json", "w") as file:
json.dump(data, file, indent=4) # indent برای خوانایی بیشتر
# خواندن از فایل JSON
with open("data.json", "r") as file:
loaded_data = json.load(file)
print(loaded_data)
نکات کلیدی در استفاده از `json`:
- `json` برای تبادل دادهها بین برنامهها استفاده میشود.
- برای نوشتن دادهها در فایل JSON، از متد `dump()` و برای خواندن دادهها، از متد `load()` استفاده کنید.
- آرگومان `indent` در متد `dump()` برای ایجاد خروجی JSON با فرمتبندی مناسب استفاده میشود.
7. مدیریت خطاهای I/O
هنگام کار با ورودی و خروجی، ممکن است خطاهای مختلفی رخ دهد، مانند:
- `FileNotFoundError`: فایل مورد نظر یافت نشد.
- `IOError`: خطای ورودی/خروجی عمومی.
- `PermissionError`: دسترسی به فایل مورد نظر مجاز نیست.
- `EOFError`: رسیدن به انتهای فایل به طور غیرمنتظره.
برای مدیریت این خطاها، میتوانید از بلوکهای `try…except` استفاده کنید:
try:
with open("myfile.txt", "r") as file:
content = file.read()
print(content)
except FileNotFoundError:
print("فایل مورد نظر یافت نشد.")
except IOError:
print("خطای ورودی/خروجی رخ داد.")
except Exception as e:
print("خطای غیرمنتظره: " + str(e))
در این مثال، اگر فایل مورد نظر یافت نشود، بلوک `except FileNotFoundError` اجرا میشود. اگر خطای ورودی/خروجی دیگری رخ دهد، بلوک `except IOError` اجرا میشود. در نهایت، اگر خطای غیرمنتظرهای رخ دهد، بلوک `except Exception` اجرا میشود.
جمعبندی
در این چیتشیت، به بررسی جامع مفاهیم و تکنیکهای ورودی و خروجی در پایتون پرداختیم. از دریافت ورودی از کاربر با `input()` گرفته تا خواندن و نوشتن فایلها با استفاده از توابع و کتابخانههای مختلف، تمامی جوانب مهم I/O در پایتون را پوشش دادیم. با استفاده از این دانش، میتوانید برنامههای پایتون قدرتمند و تعاملی ایجاد کنید که به طور موثر با دنیای خارج ارتباط برقرار میکنند.
“`