این مار خوش خط و خال
آموزش کار با زبان برنامه‌نويسی پايتون (بخش سوم)
اگرچه هنوز چندان در استفاده از زبان برنامه‌نویسی پایتون ماهر نشده‌ایم، اما این امر نمی‌تواند مانع استفاده ما از این دریای بی‌پایان امکانات باشد. در این قسمت از مجموعه، به معرفی ساده یک ماجول برای کار با داده‌های قالب 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 
 
 
شکل 1- نمونه نتايج معمول 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 اطلاعات آب و هوایی نظیر دما و سرعت وزش باد را نمایش می‌دهد. 
شکل 2- نمونه فايل 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 “==  %-11s:  %-25s ==” %(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)
 
شکل 3- نمونه اجراي برنامه weather.py
 
 در خط ۱ مانند مثال‌های شماره قبلی، شی‌بنگ آورده شده است. در خط ۲ و ۳ با دستور import دو کتابخانه urllib برای کار با آدرس‌های اینترنتی و elementtree برای کار با شیء XML به برنامه وارد شده‌اند. در خطوط ۵ و 7 دو متغیر api (محتوی آدرس اینترنتی API سایت) و items_name (محتوی فهرست تگ‌هایی که می‌خواهیم از فایل استخراج کنیم) تعریف شده‌اند. شما با بررسی ساده فایل XML سایت http://wunderground.com (همانند شکل ۲) می‌توانید تگ دلخواه خودتان نظیر فشار هوا، دمای شبنم و... را نیز به انتهای لیست متغیر items_name اضافه کرده و نتیجه را در خروجی برنامه مشاهده کنید. در خط 9 تابعی تعریف شده که توسط متد urlopen از کتابخانه urllib، با ارسال درخواست کاربر فایل حاصل از API سایت را دریافت می‌کند. سپس این فایل توسط متد parse از کتابخانه elementtree پویش شده و نتیجه در متغیر weather ذخیره شده و برگشت داده می‌شود.  تابع تعریف شده در خطوط13 تا 17 با چک کردن متغیر weather برای یافتن تگ‌هایی که ابتدای برنامه در متغیر items_name ذخیره شده‌اند، اطلاعات موردنظر را از فایل XML استخراج کرده و نتیجه را به انتهای لیست items اضافه می‌کند. پس از آن items به حلقه اصلی برنامه برگردانده می‌شود. 
 تابع تعریف شده در خط 18 برای چاپ نتایج جست‌وجو در نظر گرفته شده است. در خط 19 اگر برای آیتم دما مقداری یافت نشده باشد، اعلام می‌شود که شهر موردنظر در پایگاه داده وجود نداشته است و در غیر این صورت با یک حلقه، کل اطلاعات items چاپ خواهد شد. 
نخستين نکته قابل توجه این است که خروجی متد findall همواره یک لیست است، حتی اگر تنها یک نمونه از تگ موردنظر در فایل XML موجود باشد. چون در خط 16 این لیست به متغیر item که خود یک لیست دیگر است اضافه شده، ما برای استخراج مقادیر آن از دو اندیس استفاده کرده‌ایم. بنابراین عبارت items[1][0].text به آیتم متن ذخیره شده در نخستين عضو دومین لیست موجود در درون لیست items اشاره می‌کند که همان مقدار دمای محل مورد نظر است (به محل تگ temp_c در متغیر items_name توجه کنید).

مطلب پیشنهادی

چرا پایتون و #C هنوز نمی‌توانند جایگاه جاوا، C و ++C را به‌دست آورند؟
پایتون و #C از محدودیت‌های ریشه‌ای خود ضربه می‌خورند
 نکته دوم این‌که سیستم به کار رفته برای فرمت کردن رشته‌ها و متغیرها با شکل جدید %-25s ظاهر شده است. در اینجا عدد قبل از s اندازه فضای خالی پیش‌بینی شده را تعیین می‌کند. در چنین حالتی حتی اگر طول متغیر مورد نیاز ۵ کاراکتر باشد، طول آن با افزودن ۲۰ کاراکتر فاصله به ۲۵ خواهد رسید. این فضاهای خالی در حالت عادی در سمت چپ رشته افزوده می‌شوند که علامت منفی آن‌ها را به سمت راست رشته اصلی منتقل می‌کند. بنابراین به عنوان مثال، رشته "Tehran" به رشته "                  Tehran" تبدیل خواهد شد. تمام اعداد به کار رفته در این مثال با آزمایش و خطا و برای تنظیم جدول ایجاد شده با کاراکترهای”=” به‌دست آمده‌اند.
حلقه اصلی برنامه در خط 31 آغاز شده و  نام محل موردنظر از کاربر مي‌پرسد و با فراخوانی ترتیبی توابع، چرخه برنامه ادامه می‌یابد تا زمانی که کاربر به جای نام شهر کلمه end را وارد کند. شكل ۳ نمونه اجرای این برنامه را نشان می‌دهد.
اگر مطالب گفته شده در این قسمت و قسمت‌های قبل را دنبال کرده باشید باید بتوانید برنامه را به دلخواه خود برای دریافت اطلاعات دیگر تغییر داده یا با مطالعه راهنماهای موجود در سایت http://wiki.wunderground.com سایر API‌های آن را به کار بگیرید. در قسمت‌های بعدی به مباحث برنامه‌نویسی شیء گرا و رابط گرافیکی کاربر خواهیم پرداخت.

ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را می‌توانید از کتابخانه‌های عمومی سراسر کشور و نیز از دکه‌های روزنامه‌فروشی تهیه نمائید.

ثبت اشتراک نسخه کاغذی ماهنامه شبکه     
ثبت اشتراک نسخه آنلاین

 

کتاب الکترونیک +Network راهنمای شبکه‌ها

  • برای دانلود تنها کتاب کامل ترجمه فارسی +Network  اینجا  کلیک کنید.

کتاب الکترونیک دوره مقدماتی آموزش پایتون

  • اگر قصد یادگیری برنامه‌نویسی را دارید ولی هیچ پیش‌زمینه‌ای ندارید اینجا کلیک کنید.

ایسوس

نظر شما چیست؟