آموزش پایتون به زبان ساده قسمت سوم

آموزش کار با زبان برنامه‌نویسی پایتون (بخش سوم)

آموزش پایتون به زبان ساده

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

عده‌ای عقیده دارند که دوران برنامه‌های دسکتاپ دیگر به پایان رسیده است. محاسبات ابری، سرویس‌های رایگان اینترنتی، عرضه سیستم عامل‌های مبتنی بر‌سرویس‌های وب و سایر تحولات دوره کنونی که گاهی آن را دوران Post-Desktop می‌نامند، همگی نشانه‌ای از تأثیر و قدرت نفوذ اینترنت در دنیای محاسبات هستند. اگرچه هنوز چندان در استفاده از زبان برنامه‌نویسی پایتون ماهر نشده‌ایم، اما این امر نمی‌تواند مانع استفاده ما از این دریای بی‌پایان امکانات باشد. در این قسمت از مجموعه، به معرفی ساده یک ماجول برای کار با داده‌های قالب XML خواهیم پرداخت و از طریق یک برنامه ساده با کمک APIهای یک سرویس‌دهنده وب اطلاعات آب و هوایی محل موردنظرمان را به‌دست خواهیم آورد. شما به یقین اصطلاح XML را شنیده‌اید، هرچند ممکن است درباره آن اطلاعات زیادی نداشته باشید. در این قسمت آموزش زبان پایتون روی این موضوع متمرکز خواهیم شد. هدف این قسمت آشنا کردن شما با XML، نشان دادن روش خواندن و نوشتن فایل‌های XML در برنامه‌ها و کسب آمادگی برای نوشتن برنامه‌های مبتنی بر وب است.

XML (سرنام Extensible Markup Language) به لحاظ ساختاری بسیار شبیه HTML است. هدف از طراحی زبانXML  ایجاد ساختاری برای ذخیره و انتقال بهینه اطلاعات از طریق اینترنت و سایر سیستم‌های ارتباطی است. یک فایل XML به طور معمول یک فایل متنی ساده است که به کمک برچسب‌ها یا تگ‌های دلخواه شما قالب‌بندی شده است که این برچسب‌ها و قالب‌ها باید تا حد ممکن گویا باشند. چون قالب فایل متنی است، به سادگی قابل فشرده شدن بوده و همین امر امکان انتقال سریع‌تر و راحت‌تر آن را از طریق اینترنت فراهم می‌آورد. برخلاف HTML قالب XML به تنهایی کاری انجام نمی‌دهد. نحوه نمایش اطلاعات را مشخص نمی‌کند و همچنین شما را به استفاده از تگ‌های خاص محدود نمی‌کند. کد زیر نمونه کلی یک فایل XML را نمایش می‌دهد.

<root>
<node1> Data Here </node1>
<node2  attribute=”something”>
Node 2 Data
</node2>
<node3>
<node3sub1>  more data </node3sub1>
</node3>
</root> 

نخستین نکته قابل توجه این است که تورفتگی‌ها و فاصله‌گذاری‌ها تنها در جهت ساده کردن درک کد برای انسان پیش‌بینی شده‌اند. کد فایل‌های XML به سادگی با فرم زیر نیز کار خواهد کرد.

<root><node1>
 Data Here </node1><node2  attribute=”something”>Node 2 
Data</node2<node3><node3sub1>  more data </node3sub1>
</node3></root> 

نشانه‌هایی که در علامت‌های”<>” قرار گرفته‌اند، تگ نامیده شده و از قوانین خاصی تبعیت می‌کنند. نخست این‌که باید تک کلمه‌ای باشند. دوم این‌که هر تگ آغازین باید تگ انتهایی متناظر خود را داشته باشد که با علامت”/” قبل از نام تگ مشخص می‌شود. همچنین به خاطر داشته باشید که تگ‌ها به بزرگی و کوچکی حروف حساس هستند. بنابراین <Node1> و <noDe1> و <NODE1> هریک تگ‌های متفاوتی بوده و باید تگ انتهایی جداگانه‌ای داشته باشند. نام تگ‌ها می‌تواند متشکل از حروف، اعداد و سایر کاراکترها باشد، اما نباید با اعداد یا نشانه‌های خاص شروع شوند. همچنین در نام تگ‌ها از علامت‌های  ”.”  و  “-”  و  “:”  استفاده نکنید، زیرا برخی نرم‌افزارها این علامت‌ها را به عنوان دستور تلقی می‌کنند. به هریک از تگ‌ها عنصر یا المان هم گفته می‌شود. به طور معمول بین هر تگ آغازین و تگ پایانی مرتبط با آن داده‌هایی وجود خواهد داشت. در‌واقع وظیفه تگ‌های XML معرفی و طبقه‌بندی این داده‌ها است.

هر فایل XML در‌واقع شبیه یک درخت است که از تگ Root یا ریشه (تگی که تمام تگ‌های دیگر در داخل آن قرار گرفته‌اند)‌ شروع شده و سپس در قسمت‌های مختلف چندشاخه می‌شود. تمام فایل‌های XML باید یک تگ ریشه (نه لزوماً با نام root) داشته باشند که در‌واقع والد هر چیز دیگری در داخل فایل است. در نمونه فوق تگ Root سه تگ فرزند دارد که به ترتیب node1 و node2 و node3 هستند. و تگ node3 خود والد تگ node3sub1 است.
 همچنین به node2 هم توجه کنید که به غیر از داده‌های مرتبط، از چیزی به نام خاصیت یا attribute استفاده می‌کند. این روزها بیشتر توسعه‌دهندگان از خاصیت‌ها پرهیز می‌کنند، زیرا خود تگ‌ها به تنهایی کارآمد هستند، اما هنوز هم استفاده از خاصیت‌ها رواج دارد.
بهتر است مثال مفیدتری را بررسی‌کنیم. به فهرست ۳ نگاه کنید. در این فهرست شما تگ ریشه people را مشاهده می‌کنید که خود دارای دو تگ فرزند با نام person است. هر تگ فرزند person خود شش تگ فرزند با نام‌های  firstname، lastname، gender، address، city و state  دارد. این فایل در نگاه نخست ممکن است شبیه یک پایگاه داده به نظر برسد و در‌ واقع برخی نرم‌افزارها نیز از فایل‌های XML به عنوان یک ساختار داده ساده استفاده می‌کنند.
<people>
<person>
<firstname>Samantha</firstname>
<lastname>Pharoh</lastname>
<gender>Female</gender>
<address>123 Main St.</address>
<city>Denver</city>
<state>Colorado</state>
</person>
<person>
<firstname>Steve</firstname>
<lastname>Levon</lastname>
<gender>Male</gender>
<address>332120 Araphoe Blvd.</address>
<city>Denver</city>
<state>Colorado</state>
</person>
</people>
اکنون دیگر می‌توانیم به نوشتن یک برنامه ساده برای خواندن این فایل بپردازیم. شما به راحتی می‌توانید فایل را باز کرده، خط به خط بخوانید و بر‌اساس المان‌ها با داده‌ها کار کنید و سپس فایل را ببندید. اما در اینجا برای سهولت کار ما از یک ماجول کتابخانه‌ای به نام ElementTree استفاده می‌کنیم. شما می‌توانید به سادگی با مراجعه به آدرس http://effbot.org/downloads/#elementtree نسخه مورد نیاز را برای سیستم عامل خود دانلود کنید. ما از نسخه elementtree-1.2.6-20050316.tar.gz استفاده می‌کنیم. پس از اتمام دانلود، آن را در یک پوشه موقتی از حالت فشرده خارج کنید، سپس در پنجره ترمینال به آن پوشه رفته و دستور زیر را وارد کنید: sudo python setup.py install 
 این دستور فایل‌های مربوط به این ماجول را در‌ پوشه اصلی پایتون قرار می‌دهد و از آن پس می‌توان آن را در تمام برنامه‌های پایتون استفاده کرد.  کاربران ویندوز به جای این دستورات باید فایل elementtree-1.2.6-20050316.win32.exe را از همان آدرس دانلود کرده و اجرا کنند.
برای پروژه این شماره یک پوشه بسازید و در ویرایشگر متن دلخواه خود، کدهای فهرست ۳ را تایپ کرده و با نام xmlsample.xml در آن پوشه ذخیره‌کنید. ابتدا با نوشتن کد فهرست ۴ از صحت نصب ماجول ElementTree اطمینان حاصل می‌کنیم. این کد را با نام code1.py ذخیره و اجرا کنید.
import elementtree.ElementTree as ET
tree=ET.parse(‘xmlsample1.xml’)
ET.dump(tree)

در صورتی که همه مراحل با موفقیت انجام شده باشد باید خروجی شما دقیقاً مطابق فهرست ۳ باشد. تنها کاری که ما انجام دادیم وادار کردن ElementTree به باز کردن فایل، تحلیل آن و چاپ دوباره نتایج تحلیل (در اینجا دقیقاً همانند فایل اصلی) است. حال کد فهرست ۵ را تایپ کرده و با نام code2.py ذخیره و اجرا کنید. نتیجه باید مطابق فهرست ۶ باشد.

import elementtree.ElementTree as ET
tree=ET.parse(‘xmlsample1.xml’)
person=tree.findall(‘.//person’)
for p in person:
for dat in p:
print “Element: %s \
Data: %s” %(dat.tag,dat.text)
 
 
Element: firstname Data: Samantha 
Element: lastname Data: Pharoh 
Element: gender Data: Female 
Element: address Data: 123 Main St. 
Element: city Data: Denver 
Element: state Data: Colorado 
Element: firstname Data: Steve 
Element: lastname Data: Levon 
Element: gender Data: Male 
Element: address Data: 332120 Araphoe Blvd. 
Element: city Data: Denver 
Element: state Data: Colorado 
شکل ۱- نمونه نتایج معمول Wunder Ground برای شهر تهران
در اینجا هر داده‌ای را با المان مربوط به آن ردیف‌کرده‌ایم. در خط۱، ماجول ElementTree را import کرده‌ایم. در خط ۲ از ElementTree خواسته‌ایم که فایل را تحلیل‌کرده و نتیجه را در متغیری به نام tree ذخیره کند. در خط بعد از ماجول ElementTree خواسته‌ایم که تمام نمونه‌های موجود از تگ person را درون متغیر tree بیابد که در این مثال دو نمونه وجود داشته است. 
فایل‌های دیگر شما ممکن است محتوی یک یا هزار تگ person باشد. در خطوط ۴ و‌۵  ما یک حلقه ساده for ساخته‌ایم که تمام نمونه‌های person را پویش‌کرده، اطلاعات آن‌ها را با استفاده از خصوصیات tag. و text. نمایش می‌دهد. 
توجه کنید که متد findall ساختار درختی را بر‌اساس نام تگ یا آدرس آن جست‌وجو می‌کند. به عبارت دیگر برای جست‌وجوی تگ firstname هم می‌توانید خود عبارت ‘firstname’ را جست‌وجو کنید و هم از آدرس آن در ساختار فایل XML به شکل  ‘.//person//firstname’ برای جست‌وجو بهره ببرید. فقط به خاطر داشته باشید findall تمام نمونه‌های یافت شده را (حتی اگر تنها یک نمونه باشد) در قالب یک لیست برمی‌گرداند. به همین دلیل توانستیم در حلقه for خط ۴ از متغیر person عنوان شمارنده حلقه استفاده کنیم.

یک مثال واقعی

اکنون که با فرمت XML و ماجول ElementTree کم‌وبیش آشنا شده‌ایم، می‌توانیم از دانش خود برای استفاده از سرویس‌های اینترنتی که معمولاً بر پایه XML بنا شده‌اند، بهره ببریم. در مثال بعدی ما از API‌های ارائه شده برای سایت http://wunderground.com استفاده می‌کنیم. شاید بپرسید API چیست؟
 API سرنام (Application Programming Interface‌) است. این اصطلاح عجیب و غریب یکی از راه‌های تعامل برنامه‌ها با یکدیگر است. به کتابخانه‌هایی که در مثال‌های قبل import کردیم، فکر کنید. برخی از این کتابخانه‌ها می‌توانند به تنهایی اجرا شوند، اما اگر آن‌ها را import کنید می‌توانید از برخی توابع آن به‌صورت توکار استفاده کنید.
APIها نقش فراهم کردن دسترسی را بین برنامه‌های مختلف با زبان‌ها و سیستم‌های مختلف بر عهده دارند. عده‌ای به API به دید درهای مخفی در برنامه‌ها نگاه می‌کنند که از طریق آن‌ها می‌توانیم یک برنامه را مجبور کنیم عملیات مورد نظرمان را انجام دهند. در این مثال از یک url خاص به همراه یک کلمه کلیدی برای جست‌وجو و استخراج اطلاعات مربوط به وضعیت آب و هوای شهر موردنظرمان از طریق نرم‌افزارهای سایت http://wunderground.com استفاده خواهیم کرد. مرورگر دلخواه‌تان را باز کرده و آدرس این سایت را در آن وارد کنید. در جعبه جست‌وجوی بالای صفحه کدپستی یا نام شهر، استان یا نام کشور را وارد کنید. 
در این صورت با حجم انبوهی از اطلاعات آب و هوایی درباره محل موردنظر روبه‌رو خواهید شد. شکل ۱ نتیجه جست‌وجوی شهر تهران را نمایش می‌دهد. برای استفاده از امکانات این سایت مجبور نیستید، همواره از طریق مرورگر اینترنت خود به آن مراجعه کنید. به جای این کار می‌توانید از APIهای این سایت استفاده کنید. 
برای کسب اطلاعات بیشتر درباره APIهای این سایت، نحوه استفاده و… به آدرس زیر مراجعه کنید:
با مطالعه این صفحه متوجه خواهید شد که می‌توان به کمک تعدادی آدرس‌ خاص اینترنتی و افزودن نام شهر یا کدپستی به انتهای آن‌ها، اطلاعات مربوط به یک شهر یا ایستگاه هواشناسی را جست‌وجو کرد. 
به عنوان مثال، تابع GeoLookupXML مشخصات جغرافیایی یک محل، کد فرودگاه‌های نزدیک آن و طول و عرض جغرافیایی محل را در قالب یک فایل XML به ما بازخواهد گرداند یا تابع WXCurrentObXML شرایط فعلی آب و هوای یک منطقه را در قالب XML برگشت خواهد داد. برای استفاده از این تابع یا API کافی است نام شهر یا محل موردنظر را پس از علامت مساوی انتهای url، جایگزین KSFO کنید. به عنوان مثال، مراجعه به آدرس زیر اطلاعات آب و هوایی شهر تهران را همانند شکل ۲ برای ما نمایش خواهد داد.
در صفحه باز شده به راحتی می‌توان با کنترل تگ‌هایی نظیر <wind_string> یا <temp_c> به اطلاعاتی نظیر سرعت وزش باد و دما دست یافت. حال برای استفاده از این قابلیت برنامه فهرست ۷ را تایپ، با نام weather.py ذخیره و اجرا کنید. پس از اجرا، این برنامه نام شهر موردنظر کاربر را پرسیده و با ارسال آن به API سایت wunderground اطلاعات آب و هوایی نظیر دما و سرعت وزش باد را نمایش می‌دهد. 
شکل ۲- نمونه فایل XML برگشت داده شده از API سایت http://wunderground.com

اگر نام شهر مورد نظر اشتباه وارد شود یا چنین شهری دارای ایستگاه هواشناسی نباشد، پیغامی مبنی بر عدم وجود اطلاعات چاپ خواهد شد و با وارد کردن کلمه end برنامه به اتمام خواهد رسید. لازم به یادآوری نیست که برای اجرای درست برنامه دسترسی به اینترنت ضروری است.

#! /usr/bin/env python 
import urllib 
import elementtree.ElementTree as ET 
### Creating the request 
items_name = [“wind_string” , “temp_c”,”weather”] 
### Functions 
def getWeather(loc): 
    request=urllib.urlopen(loc) 
    weather=ET.parse(request) 
    return weather 
def extractItems(weather,items_name): 
    items=[] 
    for i in items_name: 
        items.append(weather.findall(i)) 
    return items 
def printResult(items): 
    if items[1][0].text == None: 
        print “\nWe found nothing about this city . . .” 
    else:    
        print 
        print “==============================================” 
        print “==         Weather of %-22s==” %location.upper() 
        print “==============================================” 
        for i in range(len(items)): 
            print “==  %-۱۱s:  %-۲۵s ==” %(items[i][0].tag,items[i][0].text) 
            print “==============================================” 
### Main Loop 
while True: 
    location = raw_input(“\nEnter city name: “) 
    if location.upper()==”END”: 
        break 
    loc = api + location 
    weather = getWeather(loc) 
    items=extractItems(weather,items_name) 
    printResult(items)
شکل ۳- نمونه اجرای برنامه weather.py

در خط ۱ مانند مثال‌های شماره قبلی، شی‌بنگ آورده شده است. در خط ۲ و ۳ با دستور import دو کتابخانه urllib برای کار با آدرس‌های اینترنتی و elementtree برای کار با شیء XML به برنامه وارد شده‌اند. در خطوط ۵ و ۷ دو متغیر api (محتوی آدرس اینترنتی API سایت) و items_name (محتوی فهرست تگ‌هایی که می‌خواهیم از فایل استخراج کنیم) تعریف شده‌اند. شما با بررسی ساده فایل XML سایت http://wunderground.com (همانند شکل ۲) می‌توانید تگ دلخواه خودتان نظیر فشار هوا، دمای شبنم و… را نیز به انتهای لیست متغیر items_name اضافه کرده و نتیجه را در خروجی برنامه مشاهده کنید. در خط ۹ تابعی تعریف شده که توسط متد urlopen از کتابخانه urllib، با ارسال درخواست کاربر فایل حاصل از API سایت را دریافت می‌کند. سپس این فایل توسط متد parse از کتابخانه elementtree پویش شده و نتیجه در متغیر weather ذخیره شده و برگشت داده می‌شود.  تابع تعریف شده در خطوط۱۳ تا ۱۷ با چک کردن متغیر weather برای یافتن تگ‌هایی که ابتدای برنامه در متغیر items_name ذخیره شده‌اند، اطلاعات موردنظر را از فایل XML استخراج کرده و نتیجه را به انتهای لیست items اضافه می‌کند. پس از آن items به حلقه اصلی برنامه برگردانده می‌شود.

تابع تعریف شده در خط ۱۸ برای چاپ نتایج جست‌وجو در نظر گرفته شده است. در خط ۱۹ اگر برای آیتم دما مقداری یافت نشده باشد، اعلام می‌شود که شهر موردنظر در پایگاه داده وجود نداشته است و در غیر این صورت با یک حلقه، کل اطلاعات items چاپ خواهد شد. 

نخستین نکته قابل توجه این است که خروجی متد findall همواره یک لیست است، حتی اگر تنها یک نمونه از تگ موردنظر در فایل XML موجود باشد. چون در خط ۱۶ این لیست به متغیر item که خود یک لیست دیگر است اضافه شده، ما برای استخراج مقادیر آن از دو اندیس استفاده کرده‌ایم. بنابراین عبارت items[1][0].text به آیتم متن ذخیره شده در نخستین عضو دومین لیست موجود در درون لیست items اشاره می‌کند که همان مقدار دمای محل مورد نظر است (به محل تگ temp_c در متغیر items_name توجه کنید).

 نکته دوم این‌که سیستم به کار رفته برای فرمت کردن رشته‌ها و متغیرها با شکل جدید %-۲۵s ظاهر شده است. در اینجا عدد قبل از s اندازه فضای خالی پیش‌بینی شده را تعیین می‌کند. در چنین حالتی حتی اگر طول متغیر مورد نیاز ۵ کاراکتر باشد، طول آن با افزودن ۲۰ کاراکتر فاصله به ۲۵ خواهد رسید. این فضاهای خالی در حالت عادی در سمت چپ رشته افزوده می‌شوند که علامت منفی آن‌ها را به سمت راست رشته اصلی منتقل می‌کند. بنابراین به عنوان مثال، رشته “Tehran” به رشته ”                  Tehran” تبدیل خواهد شد. تمام اعداد به کار رفته در این مثال با آزمایش و خطا و برای تنظیم جدول ایجاد شده با کاراکترهای”=” به‌دست آمده‌اند.

حلقه اصلی برنامه در خط ۳۱ آغاز شده و  نام محل موردنظر از کاربر می‌پرسد و با فراخوانی ترتیبی توابع، چرخه برنامه ادامه می‌یابد تا زمانی که کاربر به جای نام شهر کلمه end را وارد کند. شکل ۳ نمونه اجرای این برنامه را نشان می‌دهد.
اگر مطالب گفته شده در این قسمت و قسمت‌های قبل را دنبال کرده باشید باید بتوانید برنامه را به دلخواه خود برای دریافت اطلاعات دیگر تغییر داده یا با مطالعه راهنماهای موجود در سایت http://wiki.wunderground.com سایر API‌های آن را به کار بگیرید. در قسمت‌های بعدی به مباحث برنامه‌نویسی شیء گرا و رابط گرافیکی کاربر خواهیم پرداخت.

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

اشتراك گذاری نوشته

دیدگاه (3)

  • Tony پاسخ

    Hello again!

    I have gotten an email saying that my original message was not delivered so here goes again. Please confirm receipt.

    As mentioned in my original message, I would like to contribute an article to your blog on how cryptocurrencies are reshaping the adult and more particularly the escort industry. I had a friend who ran an escort agency in the UK and he always had problems with the authorities, banks and even payment processors. I genuinely feel that cryptocurrencies have the potential to liberalise the escort industry and replace the anachronistic banking model which no longer works in today’s modern society.

    Whilst writing this article, I contacted a couple of websites to get some references and one website has even provided me with some images and have given their permission for you to use them. I have included a short bio about myself. I hope your audience enjoys reading my article.

    I can potentially write a couple more articles as and when I get some free time. It is crazy busy at work after all the festivities!

    Have a fab day!

    Regards
    Tony

    دی ۱۸, ۱۳۹۷ در ۱:۲۹ ق٫ظ
    • میرسینا ثروتمند پاسخ

      Hi Tony
      At first We apologize for the accident happened for your first E-mail. About your contribute an article it is an honor to have your work on our website but as you have seen this is a website with persian lanuage so we have to translate it to farsi. If you are ok with that, we will be happy to receive your work as soon as possible.

      دی ۲۲, ۱۳۹۷ در ۸:۰۵ ق٫ظ
  • Tony پاسخ

    Hello again!

    I have gotten an email saying that my original message was not delivered so here goes again. Please confirm receipt.

    As mentioned in my original message, I would like to contribute an article to your blog on how cryptocurrencies are reshaping the adult and more particularly the escort industry. I had a friend who ran an escort agency in the UK and he always had problems with the authorities, banks and even payment processors. I genuinely feel that cryptocurrencies have the potential to liberalise the escort industry and replace the anachronistic banking model which no longer works in today’s modern society.

    You can find the article on my G-Drive:

    https://drive.google.com/drive/folders/13pbNYoRoWLMHnrU1ySnxF6Zq7JMXsSI3?usp=sharing

    Whilst writing this article, I contacted a couple of websites to get some references and one website has even provided me with some images and have given their permission for you to use them. I have included a short bio about myself. I hope your audience enjoys reading my article.

    I can potentially write a couple more articles as and when I get some free time. It is crazy busy at work after all the festivities!

    Have a fab day!

    Regards
    Tony

    بهمن ۲۲, ۱۳۹۷ در ۱:۰۳ ب٫ظ

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *