خانه / آموزش‌ها / آموزش جامع ورودی و خروجی در پایتون (Python I/O)

آموزش جامع ورودی و خروجی در پایتون (Python I/O)

🐍 HomeOfPython
|
📅 1404/10/18

سطح مقدماتی (Beginner Level)

در برنامه‌نویسی، ارتباط با دنیای بیرون از طریق ورودی (Input) و خروجی (Output) انجام می‌شود. این "دنیای بیرون" می‌تواند کاربر پشت کیبورد، یک فایل متنی، یا حتی خروجی کنسول باشد. در این بخش با مفاهیم پایه‌ی print، input و کار با فایل‌های متنی آشنا می‌شویم.

۱. خروجی استاندارد (Standard Output)

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

نمودار جریان ورودی و خروجی

مثال ۱: چاپ ساده و فرمت‌بندی (f-strings)

ساده‌ترین شکل استفاده، چاپ رشته‌ها و متغیرهاست. استفاده از f-string (قرار دادن f قبل از رشته) روش مدرن برای ترکیب متن و متغیر است.

Python

مثال ۲: مدیریت جداکننده‌ها و انتهای خط

تابع print دارای پارامترهای sep (جداکننده) و end (کاراکتر پایانی) است.

Python

مثال ۳: چاپ چندخطی (Snippet)

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

python
# Static code: Multi-line string snippet
message = """
این یک متن طولانی است
که در چندین خط
نوشته شده است.
"""
print(message)

۲. ورودی استاندارد (Standard Input)

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

نکته: کدهای زیر به دلیل نیاز به تعامل با کاربر (تایپ کردن)، به صورت Static قرار داده شده‌اند.

مثال ۱: دریافت رشته ساده

python
# Static code: Getting user name
name = input("لطفا نام خود را وارد کنید: ")
print(f"سلام {name}")

مثال ۲: دریافت و تبدیل عدد

python
# Static code: Input casting
age_str = input("سن خود را وارد کنید: ")
age = int(age_str)  # تبدیل رشته به عدد صحیح

if age > 18:
    print("شما مجاز هستید.")

۳. کار با فایل‌ها (File I/O)

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

حالت‌های باز کردن فایل (Modes):

  • 'r': خواندن (پیش‌فرض).
  • 'w': نوشتن (اگر فایل باشد پاکش می‌کند، اگر نباشد می‌سازد).
  • 'a': اضافه کردن به انتهای فایل (Append).

استفاده از with (Context Manager)

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

مثال ۱: نوشتن در فایل (Creating a File)

در این مثال یک فایل می‌سازیم و در آن می‌نویسیم.

Python

مثال ۲: خواندن از فایل

حالا فایلی که در مرحله قبل ساختیم را می‌خوانیم.

Python

مثال ۳: خواندن خط به خط (برای فایل‌های بزرگ)

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

python
# Static code: Reading line by line logic
def read_huge_file(filename):
    with open(filename, 'r') as f:
        for line in f:
            print(line.strip()) # strip برای حذف فضای خالی اضافه

سطح پیشرفته (Professional Level)

در سطح حرفه‌ای، مدیریت I/O فراتر از print و open ساده است. اینجا با جریان‌های سیستم (sys), مدیریت مکان‌نما (seek/tell)، بافریگ و ماژول مدرن pathlib آشنا می‌شویم.

۱. جریان‌های سیستم (System Streams)

پایتون (و سیستم‌عامل) ورودی و خروجی را به عنوان جریان‌های داده (Streams) می‌بینند که در ماژول sys قرار دارند:

  • sys.stdout: همان جایی که print می‌نویسد.
  • sys.stderr: مخصوص خطاها (معمولاً با رنگ قرمز در ترمینال‌ها نمایش داده می‌شود).
  • sys.stdin: همان جایی که input از آن می‌خواند.

مثال ۱: نوشتن مستقیم در stdout و stderr

Python

مثال ۲: تغییر مسیر خروجی (Redirection)

می‌توان خروجی print را به جای کنسول، به یک فایل هدایت کرد.

python
# Static code: Redirecting stdout to a file
import sys

# ذخیره stdout اصلی برای بازگرداندن در آینده
original_stdout = sys.stdout 

with open('log.txt', 'w') as f:
    sys.stdout = f  # تغییر مسیر خروجی به فایل
    print("این متن در فایل ذخیره می‌شود، نه در کنسول.")
    
# بازگرداندن به حالت عادی
sys.stdout = original_stdout
print("دوباره در کنسول هستیم.")

۲. کنترل مکان‌نما (Cursor Manipulation)

وقتی فایلی را می‌خوانید، یک "مکان‌نما" (Cursor) در فایل حرکت می‌کند. با متدهای tell() (موقعیت فعلی) و seek() (پرش به موقعیت خاص) می‌توانید این مکان‌نما را کنترل کنید.

مثال ۱: خواندن، بازگشت و خواندن دوباره

این تکنیک برای فایل‌هایی که هدر (Header) دارند یا نیاز به پارس کردن چندباره دارند مفید است.

Python

۳. کار با pathlib (روش مدرن)

در پایتون‌های جدید، استفاده از ماژول os.path قدیمی شده و pathlib توصیه می‌شود. این ماژول مسیر فایل‌ها را به صورت شیء (Object) می‌بیند و با سیستم‌عامل‌های مختلف (ویندوز/لینوکس) سازگار است.

مثال ۱: خواندن متن با Path

Python

مثال ۲: پیمایش دایرکتوری‌ها

یافتن تمام فایل‌های .txt در پوشه جاری.

python
# Static code: Globbing with pathlib
from pathlib import Path

def list_text_files():
    current_dir = Path(".")
    # یافتن تمام فایل‌های با پسوند txt
    for file in current_dir.glob("*.txt"):
        print(file.name)

۴. حالت‌های ترکیبی فایل (Advanced Modes)

علاوه بر r و w، حالت‌های ترکیبی مهمی وجود دارد:

  • r+: خواندن و نوشتن (فایل باید وجود داشته باشد). اشاره‌گر ابتدا در شروع فایل است.
  • w+: خواندن و نوشتن (فایل را پاک می‌کند/می‌سازد).
  • a+: خواندن و نوشتن (اشاره‌گر در انتهای فایل است برای Append).

مثال ۱: آپدیت کردن بخشی از فایل با r+

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

Python

نکات نهایی برای حرفه‌ای‌ها

  1. بافرینگ (Buffering): تابع open آرگومان buffering دارد. برای نوشتن مستقیم روی دیسک (بدون بافر) مقدار ۰ را بدهید (فقط در حالت باینری wb).
  2. مدیریت خطا: همیشه عملیات I/O را در بلوک try...except قرار دهید تا اگر فایل قفل بود یا وجود نداشت، برنامه کرش نکند.
  3. انکودینگ: در ویندوز پیش‌فرض انکودینگ ممکن است cp1252 باشد. همیشه encoding="utf-8" را صریحاً ذکر کنید تا با کاراکترهای فارسی به مشکل نخورید.