Zanurkuj w Pythonie/Abstrakcyjne źródła wejścia: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
poprawki |
m deamerykanizacja pisowni |
||
Linia 1:
== Abstrakcyjne źródła wejścia ==
Jedną z najważniejszych możliwości Pythona jest jego dynamiczne wiązanie, a jednym z najbardziej przydatnych przykładów wykorzystania tego jest ''obiekt
Wiele funkcji, które wymagają jakiegoś źródła wejścia, mogłyby po prostu przyjmować jako argument nazwę pliku, następnie go otwierać, czytać, a na końcu go zamykać. Jednak tego nie robią. Zamiast działać w ten sposób, jako argument przyjmują obiekt pliku lub ''obiekt
W najprostszym przypadku ''obiekt
Powyżej opisaliśmy, w jaki sposób działają prawdziwe pliki. Jednak nie musimy się ograniczać do prawdziwych plików. Źródłem wejścia może być wszystko: plik na dysku, strona internetowa, czy nawet jakiś łańcuch znaków. Dopóki przekazujemy do funkcji ''obiekt
Może się zastanawiamy, co ma to wspólnego z przetwarzaniem XML-a? Otóż <code>minidom.parse</code> jest taką funkcją, do której możemy przekazać ''obiekt
{{Python/Przykład
Linia 70:
[...ciach...]</nowiki>}}
# Jak już zaobserwowaliśmy w poprzednim rozdziale, <code>urlopen</code> przyjmuje adres URL strony internetowej i zwraca ''obiekt
# Teraz przekazujemy ten ''obiekt
# Jak tylko ''obiekt
# Przy okazji, ten URL jest prawdziwy i on naprawdę jest dokumentem XML. Reprezentuje on aktualne nagłówki, techniczne newsy i plotki w [http://slashdot.org/ Slashdot].
}}
Linia 91:
OK, to możemy korzystać z funkcji <code>minidom.parse</code> zarówno do parsowania lokalnych plików jak i odległych URL-ów, ale do parsowania łańcuchów znaków wykorzystujemy... inną funkcję. Oznacza to, że jeśli chcielibyśmy, aby nasz program mógł dać wyjście z pliku, adresu URL lub łańcucha znaków, potrzebujemy specjalnej logiki, aby sprawdzić czy mamy do czynienia z łańcuchem znaków, a jeśli tak, to wywołać funkcję <code>parseString</code> zamiast <code>parse</code>. Jakie to niesatysfakcjonujące...
Gdyby tylko był sposób, aby zmienić łańcuch znaków na obiekt ''
{{Python/Przykład
Linia 112:
>>> ssock.close() #(6)
# Moduł <code>StringIO</code> zawiera tylko jedną klasę, także nazwaną <code>StringIO</code>, która pozwala zamienić napis w ''obiekt
# Teraz już mamy ''obiekt
# Wywołując ponownie <code>read</code> otrzymamy pusty napis. W ten sposób działa prawdziwy obiekt pliku; kiedy już zostanie przeczytany cały plik, nie można czytać więcej bez wyraźnego przesunięcia do początku pliku. Obiekt <code>StringIO</code> pracuje w ten sam sposób.
# Możemy jawnie przesunąć się do początku napisu, podobnie jak możemy się przesunąć w pliku, wykorzystując metodę <code>seek</code> obiektu klasy <code>StringIO</code>.
Linia 121:
{{Python/Przykład
|10.5|Parsowanie XML-a z łańcucha znaków (sposób z obiektem
|tekst=
>>> contents = "<nowiki><grammar><ref id='bit'><p>0</p><p>1</p></ref></grammar></nowiki>"
Linia 131:
{{samp|<nowiki><grammar><ref id="bit"><p>0</p><p>1</p></ref></grammar></nowiki>}}
# Teraz możemy przekazać obiekt
}}
To już wiemy, jak za pomocą pojedynczej funkcji, <code>minidom.parse</code>, sparsować dokument XML przechowywany na stronie internetowej, lokalnym pliku, czy w łańcuchu znaków. Dla strony internetowej wykorzystamy <code>urlopen</code>, aby dostać ''obiekt
{{Python/Przykład
Linia 159:
</pre>
# Funkcja <code>openAnything</code> przyjmuje pojedynczy argument, <code>source</code>, i zwraca ''obiekt
# Najpierw sprawdzamy, czy <code>source</code> jest URL-em. Robimy to brutalnie: próbujemy otworzyć to jako URL i cicho pomijamy błędy spowodowane próbą otworzenia czegoś, co nie jest URL-em. Jest to właściwie eleganckie w tym sensie, że jeśli <code>urllib</code> będzie kiedyś obsługiwał nowe typy URL-i, nasz program także je obsłuży i to bez konieczności zmiany kodu. Jeśli <code>urllib</code> jest w stanie otworzyć <code>source</code>, to <code>return</code> wykopie nas bezpośrednio z funkcji i poniższe instrukcje <code>try</code> nie będą nigdy wykonywane.
# W innym przypadku, gdy <code>urllib</code> wrzasnął na nas i powiedział, że <code>source</code> nie jest poprawnym URL-em, zakładamy, że jest to ścieżka do pliku znajdującego się na dysku i próbujemy go otworzyć. Ponownie, nic nie robimy, by sprawdzić, czy <code>source</code> jest poprawną nazwą pliku (zasady określające poprawność nazwy pliku są znacząco różne na różnych platformach, dlatego prawdopodobnie i tak byśmy to źle zrobili). Zamiast tego, na ślepo otwieramy plik i cicho pomijamy wszystkie błędy.
# W tym miejscu zakładamy, że <code>source</code> jest łańcuchem znaków, który przechowuje dokument XML (ponieważ nic innego nie zadziałało), dlatego wykorzystujemy <code>StringIO</code>, aby utworzyć ''obiekt
}}
Linia 180:
}}
<noinclude>{{Nawigacja|Zanurkuj w Pythonie|
[[../Przetwarzanie XML-a - podsumowanie|Podsumowanie]]|
[[../Standardowy strumień wejścia, wyjścia i błędów/]]|
}}
{{Podświetl|py}}</noinclude>
|