ورودی و خروجی {io#}

موقعیت هایی وجود خواهد داشت که در آن برنامۀ شما باید با کاربر تعامل داشته باشد. برای مثال، ممکن است بخواهید ورودی را از کاربر دریافت کرده و سپس برخی نتایج را برای او بازگردانید. می توانیم به ترتیب این کار را با استفاده از توابع input و print انجام دهیم.

برای خروجی، همچنین می توانیم از روش های مختلف کلاس str (رشته) استفاده کنیم. برای مثال، می توانید از روش rjust استفاده کنید تا رشته ای به دست آورید که نسبت به عرض مشخص شده، راست چین شده است. برای جزئیات بیشتر help(str) را مشاهده کنید.

یکی دیگر از انواع رایج ورودی/خروجی کار با فایل ها است. توانایی ایجاد، خواندن و نوشتن فایل ها برای بسیاری از برنامه ها ضروری است و در این فصل این جنبه را بررسی خواهیم کرد.

دریافت ورودی از کاربر

این برنامه را با نام io_input.py ذخیره کنید:

def reverse(text):
    return text[::-1]


def is_palindrome(text):
    return text == reverse(text)


something = input("Enter text: ")
if is_palindrome(something):
    print("Yes, it is a palindrome")
else:
    print("No, it is not a palindrome")

خروجی:

$ python3 io_input.py
Enter text: sir
No, it is not a palindrome

$ python3 io_input.py
Enter text: madam
Yes, it is a palindrome

$ python3 io_input.py
Enter text: racecar
Yes, it is a palindrome

نحوۀ عملکرد

برای معکوس کردن متن از قابلیت برش (slicing) استفاده می کنیم. پیش تر دیدیم که چگونه می توانیم با استفاده از کد seq[a:b] از دنباله ها برش ایجاد کرد slices from sequences؛ به این صورت که برش از موقعیت a شروع شده و تا موقعیت b ادامه پیدا می کند. همچنین می توانیم آرگومان سومی را مشخص کنیم که گام برش را تعیین کند. مقدار پیش فرض گام 1 است و به همین دلیل این عبارت بخش پیوسته ای از متن را بر می گرداند. تعیین یک گام منفی،یعنی 1-، متن را به صورت معکوس بر می گرداند.

تابع ()input یک رشته را به عنوان آرگومان دریافت کرده و آن را به کاربر نمایش می دهد. سپس منتظر می ماند تا کاربر چیزی تایپ کند و کلید return را فشار دهد. هنگامی که کاربر متن مورد نظر خود را وارد کرد و کلید return را فشار داد، تابع ()input آن متن وارد شده توسط کاربر را باز می گرداند.

ما آن متن را دریافت کرده و معکوس می کنیم. اگر متن اصلی و متن معکوس شده برابر باشند، آن متن یک palindrome است.

تمرین تکمیلی

بررسی اینکه آیا یک متن palindrome است یا خیر، باید علائم نگارشی، فاصله ها و بزرگی و کوچکی حروف را نادیده بگیرد. برای نمونه، ".Rise to vote, sir" نیز یک پالیندروم است اما برنامه فعلی ما آن را تشخیص نمی دهد. آیا می توانید برنامۀ بالا را بهبود بخشید تا بتواند این پالیندروم را نیز تشخیص دهد؟

اگر به راهنمایی نیاز دارید، ایده این است که ... [1^]

فایل ها

می توانید با ایجاد یک شئ از کلاس file و استفاده از روش های read , readline یا write، فایل ها را برای خواندن یا نوشتن باز کرده و از آن استفاده کنید. توانایی خواندن و نوشتن در یک فایل، به حالتی که برای باز کردن فایل مشخص کرده اید، بستگی دارد. در نهایت، وقتی کار شما با فایل به اتمام رسید، روش close را فراخوانی می کنید تا به پایتون اعلام کند که دیگر با فایل کاری نداریم.

مثال را با نام io_using_file.py ذخیره کنید:

poem = '''\
Programming is fun
When the work is done
if you wanna make your work also fun:
    use Python!
'''

# Open for 'w'riting
f = open('poem.txt', 'w')
# Write text to file
f.write(poem)
# Close the file
f.close()

# If no mode is specified,
# 'r'ead mode is assumed by default
f = open('poem.txt')
while True:
    line = f.readline()
    # Zero length indicates EOF
    if len(line) == 0:
        break
    # The `line` already has a newline
    # at the end of each line
    # since it is reading from a file.
    print(line, end='')
# close the file
f.close()

خروجی:

$ python3 io_using_file.py
Programming is fun
When the work is done
if you wanna make your work also fun:
    use Python!

نحوۀ عملکرد

توجه داشته باشید که می توانیم به سادگی با استفاده از روش open یک شئ فایل جدید ایجاد کنیم. ما این فایل را با استفاده از تابع داخلی open و با مشخص کردن نام فایل و حالتی را که می خواهیم در آن فایل باز شود، باز کنیم (یا اگر از قبل وجود نداشته باشد، آن را ایجاد می کنیم). حالت می تواند حالت خواندن ('r')، حالت نوشتن ('w') یا حالت الحاق ('a') باشد. همچنین می توانیم مشخص کنیم که خواندن، نوشتن یا الحاق در حالت متنی ('t') یا حالت باینری ('b') انجام شود. در واقع، حالت های بسیار بیشتری وجود دارد و help(open) جزئیات بیشتری دربارۀ آنها ارائه می دهد. به طور پیش فرض، ()open فایل را یک فایل متنی در نظر می گیرد و آن را در حالت خواندن باز می کند.

در مثال ما، ابتدا فایل را در حالت نوشتن متنی باز یا ایجاد می کنیم و از روش write شئ فایل استفاده می کنیم تا متغیر رشته ای poem را در فایل بنویسیم و در نهایت فایل را با close می بندیم.

سپس همان فایل را دوباره برای خواندن باز می کنیم. نیازی نیست حالتی را مشخص کنیم، زیرا 'read text file' حالت پیش فرض است. با استفاده از روش readline هر خط از فایل را در یک حلقه می خوانیم. این روش یک خط کامل را از جمله کاراکتر خط جدید در انتهای آن باز می گرداند. زمانی که یک رشتۀ خالی باز گردانده می شود، بدین معناست که به انتهای فایل رسیده ایم و از حلقه خارج می شویم.

در آخر، بالاخره با close فایل را می بندیم.

از خروجی readline می توان مشاهده کرد که این برنامه واقعاً داده ها را در فایل جدید poem.txt نوشته و آنها را از آن فایل خوانده است.

Pickle

پایتون یک ماژول استاندارد به نام pickle ارائه می دهد که می توانید از آن برای ذخیره هر شئ معمولی پایتون در یک فایل و سپس بازیابی در زمان دیگری استفاده کنید. به این فرآیند ذخیره سازی پایدار شئ گفته می شود.

مثال را تحت عنوان io_pickle.py ذخیره کنید:

import pickle

# The name of the file where we will store the object
shoplistfile = 'shoplist.data'
# The list of things to buy
shoplist = ['apple', 'mango', 'carrot']

# Write to the file
f = open(shoplistfile, 'wb')
# Dump the object to a file
pickle.dump(shoplist, f)
f.close()

# Destroy the shoplist variable
del shoplist

# Read back from the storage
f = open(shoplistfile, 'rb')
# Load the object from the file
storedlist = pickle.load(f)
print(storedlist)
f.close()

خروجی:

$ python io_pickle.py
['apple', 'mango', 'carrot']

نحوۀ عملکرد

برای ذخیرۀ یک شئ در یک فایل، ابتدا باید فایل را در حالت نوشتن باینری یعنی (wb) با استفاده از open باز کنیم و سپس تابع dumb را از ماژول pickle فراخوانی کنیم. به این فرآیند pickling گفته می شود.

سپس با استفاده از تابع load از ماژول pickle، شئ را بازیابی کنیم؛ این تابع شئ ذخیره شده را بر می گرداند. این فرآیند unpickling نام دارد.

Unicode

تا اینجا، هنگام نوشتن و استفاده از رشته ها یا هنگام خواندن و نوشتن در یک فایل، تنها از کاراکترهای سادۀ انگلیسی استفاده کردیم. هم کاراکترهای انگلیسی و هم کاراکترهای غیر انگلیسی را می توان در یونیکد (Unicode) نمایش داد (برای اطلاعات بیشتر، لطفاً مقالات ارائه شده در آخر این بخش را مطالعه کنید). پایتون 3 به طور پیش فرض متغیر های رشته ای را (یعنی تمام متن هایی را که با استفاده از نقل قول تکی،دوتایی یا سه تایی نوشته ایم) به صورت یونیکد ذخیره می کند.

توجه: اگر از پایتون 2 استفاده می کنید و می خواهید زبان های غیر انگلیسی را نیز بخوانید و بنویسید، باید از نوع unicode استفاده کنید و این نوع با کاراکتر u آغاز می شود، برای مثال: "u"hello world.

>>> "hello world"
'hello world'
>>> type("hello world")
<class 'str'>
>>> u"hello world"
'hello world'
>>> type(u"hello world")
<class 'str'>

هنگامی که داده از طریق اینترنت فرستاده می شود، باید آنها را به صورت بایت ها (bytes) ارسال کنیم... چیزی که کامپیوتر شما می توند به راحتی آن را درک کند. قواعد تبدیل یونیکد (که پایتون هنگام ذخیرۀ یک رشته از آن استفاده می کند). به بایت ها، رمزگذاری (encoding) نامیده می شود. یکی از رمزگذاری های معروف، UTF-8 است. میتوانیم با استفاده از یک آرگومان کلیدی ساده در تابع open داده ها را با UTF-8 بخوانیم و بنویسیم.

# encoding=utf-8
import io

f = io.open("abc.txt", "wt", encoding="utf-8")
f.write(u"Imagine non-English language here")
f.close()

text = io.open("abc.txt", encoding="utf-8").read()
print(text)

نحوۀ عملکرد

از io.open استفاده می کنیم و سپس در اولین دستور open از آرگومان encoding برای رمزگذاری پیام استفاده می کنیم و در دومین دستور open نیز از آن برای رمزگشایی (decoding) پیام استفاده می کنیم. توجه داشته باشید که هنگام استفاده از حالت متنی، باید در دستور open از encoding استفاده کنیم.

هر زمان برنامه ای می نویسیم که از لیترال های یونیکد (Unicode Literals) یعنی رشته هایی که با قرار دادن u پیش از آنها مشخص می شوند، استفاده می کند، همانند آنچه در بالا به کار بردیم، باید مطمئن شویم که خود پایتون نیز از UTF-8 بودن برنامۀ ما آگاه است. برای این منظور، باید کامنت encoding=utf-8 # را در ابتدای برنامه قرار دهیم.

برای کسب اطلاعات بیشتر دربارۀ این موضوع، مطالب زیر را مطالعه کنید:

جمع بندی

در این فصل انواع مختلف ورودی/خروجی، کار با فایل ها، ماژول pickle و یونیکد را بررسی کردیم.

در ادامه، مفهوم استثناها (exceptions) را بررسی خواهیم کرد.


[1^]: از یک تاپل (می توانید لیستی کامل از تمام علائم نگارشی را پیدا کنید) و تمام کاراکترهای غیر مجاز را در آن قرار دهید. سپس از آزمون عضویت برای تعیین اینکه آیا یک کاراکتر باید حذف شود یا خیر استفاده کنید؛ یعنی: (... , ., ?, !) = forbidden.

results matching ""

    No results matching ""