Aplikacje webowe w Pythonie dla programistów PHP pt.3

W poprzednich częściach tutorialu omawiałem jak stworzyć szkielet aplikacji webowej w Pythonie przy użyciu mod_wsgi oraz jak wykonywać proste operacje na bazie (select, insert). Dzisiejszy wpis będzie o odczytywaniu informacji z plików w popularnych formatach XML i CSV.

Jak zaraz zobaczycie w obu językach wygląda to podobnie, najpierw parsowanie CSV w Pythonie oraz wyświetlanie HTML-owej tabelki:

import csv

def test(path):
    sFile = path + 'files/sample.csv'
    oReader = csv.reader(open(sFile), delimiter=',', quotechar='"')
    aResult = []
    for row in oReader:
        aResult.append(row)

    sResult = ''
    for row in aResult:
        sResult += ''
        for cell in row:
            sResult += ''
        sResult += ''

    sResult += '
' + cell + '
' return sResult

Ekwiwalent w php


Jak widać kod w Pythonie jest troszkę krótszy ze względu na większą abstrakcje – w PHP można by osiągnąć ten sam efekt poprzez opakowanie funkcji fgetcsv w obiekt implementujący interfejs Iterator.

Naszym kolejnym obiektem zainteresowanie będzie parsowanie plików XML, za zadanie weźmiemy sobie wyciągnięcie z pliku RSS wszystkich tytułów wpisów, będziemy korzystać z pasera typu DOM.

Kod pythonowy:

def test(path):
    from xml.dom.minidom import *

    sFile = path + 'files/rss.xml'
    # @type oDom xml.dom.minidom.Document
    oDom = parse(sFile)

    lTitles = oDom.getElementsByTagName('title')
    output = ''
    
    output += "

Titles

" output += "
    " for node in lTitles: output += "
  • " output += node.childNodes[0].nodeValue output += "
  • " output += "
" return output

Kod w PHP:

$sPath = 'res'.DIRECTORY_SEPARATOR.'xml'.DIRECTORY_SEPARATOR.'rss.xml';

$oDom = new DOMDocument();
$oDom->preserverWhiteSpace = false;
$oDom->load($sPath);

$oTitles = $oDom->getElementsByTagName('title');
echo "

Titles

"; echo "
    "; foreach($oTitles as $title){ $sTitle = $title->nodeValue; echo "
  • ",$sTitle,"
  • "; } echo "
";

Widać kilka zasadniczych różnic w obu językach, po pierwsze aby parsować dokument XML w php należy użyć metody DOMDocument::load, natomiast w Pythonie mamy metode parse modułu minidom.

Po drugie w PHP jeżeli mamy noda którego jedyną zawartością jest tekst, to możemy się do niego dostać przez właściwość nodeValue, natomiast Pythonowy parser widzi nod z tekstem wewnątrz jak nod z dzieckiem, które to jest nodem tekstowym.

Tym wpisem prawdopodobnie zakończę serię „Aplikacje webowe w Pythonie dla programistów PHP”, mam nadzieje, że udało mi się zachęcić Was do zabawy z tym ciekawym językiem i spojrzenia z innej perspektywy na znane Wam zapewne zagadnienia w programowaniu.

Obecnie jestem na etapie pisania pracy magisterskiej o wydajności aplikacji www. Mam w niej m.in porównać wydajność skryptów w PHP i Pythonie, jak tylko ukończę testy, zamierzam przedstawić wyniki wraz z metodologią w jednym z kolejnych postów.

  1. kilas pisze:

    Bardzo fajnie wygląda to programowanie w Pythonie, nawet łatwiej i mniejszym nakładem pracy niż w PHP (choć jeszcze nie testowałem). Niebawem chyba trochę pobawię się w tym języku, dobrze jest poznać jakąś alternatywę dla PHP :-)

  2. Robert Gawron pisze:

    Uciął Ci się koniec taga w drugim przykładzie pythonowym, o tu:

    output += „</ul"

    :)

  3. Wojciech Soczyński pisze:

    @robert gawron: dzięki, już poprawiłem
    @kilas: zapraszam do przeczytania poprzednich części tutoriala 😉

  4. kilas pisze:

    Wojciech, czytałem na bieżąco :) Niebawem będzie trzeba dołączyć do Apache mod_wsgi i też się pobawić.

    Swoją drogą, dobrze byś zrobił na swoim blogu zakładkę „Podobne wpisy” (np. http://wordpress.org/extend/plugins/wordpress-23-related-posts-plugin/) – bardzo pomocne, zwłaszcza w przypadku takich kilkuczęściowych wpisach.

  5. Wojciech Soczyński pisze:

    Dzięki za sugestie, już dołożyłem :)

  1. There are no trackbacks for this post yet.

Leave a Reply

Informuj mnie o odpowiedziach poprzez e-mail. Możesz również subskrybować wpis bez zostawiania komentarza.