Strona główna Polish Python Coders Group
   Strona główna   Pomoc Zaloguj się Rejestracja  
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji

Aktualności:
Szukaj Szukaj
Strony: [1]   Do dołu
Drukuj
Wątek: Pobieranie archiwalnych danych  (Przeczytany 208 razy)
« : 18:51 07/02/19 »
piotrekk10 Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 6


Cześć,
jestem w trakcie pisanie swojego pierwszego programu i natrafiłem na problem, którego od dłuższego czasu nie jestem w stanie rozwiązać. Podczas uruchamiania programu zmienna wybrana_data przybiera dzisiejszą datę i dla niej pobierana jest pierwsza wartość. Jeśli jednak dokonam zmiany daty i spróbuję pobrać dane ponownie, w konsoli wyskakuje błąd ConnectionResetError: [WinError 10054] Istniejące połączenie zostało gwałtownie zamknięte przez zdalnego hosta. Co może być tego przyczyną? Czy mogę liczyć na Waszą pomoc? Czekam na sugestie.

Kod metody pobierającej dane:
   
Kod
def pobierz_dane():
   print(wybrana_data)
   adres = f'https://api.nbp.pl/api/cenyzlota/{wybrana_data}/?format=json'
   response = request.urlopen(adres)
   txt = response.read().decode('utf-8')
   response.close()
   dane = json.loads(txt)
Zapisane
« Odpowiedz #1 : 12:49 08/02/19 »
Guaz Offline
Professional Python User

Zobacz profil
***

Reputacja: 53
Płeć: Mężczyzna
Wiadomości: 412


Rozumiem że robisz to w jakiejś pętli?

Jeśli tak, to zamknij pierwsze połączenie, nim otworzysz kolejne. Framework hosta odrzuca drugie, jednoczesne połączenie od bota. A przynajmniej tyle mi powiedziały google Uśmiech.
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
« Odpowiedz #2 : 15:44 08/02/19 »
piotrekk10 Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 6


Tak, wszystko zapętla Tkinter (o ile to dobrze rozumiem). Pobieranie danych jest wywoływane za pomocą przycisku. Też trochę czytałem nt. zamykania tego połączenia - jedno źródło mówi, że jak tylko otrzymuję odp. od hosta to połączanie się samo zamyka, drugie proponuje inne rozwiązanie, które pomimo zastosowania nic nie zmieniło.

Kod
def pobierz_dane():
   print(wybrana_data)
   global adres
   adres = f'https://api.nbp.pl/api/cenyzlota/{wybrana_data}/?format=json'
   with contextlib.closing(request.urlopen(adres)) as x:
       txt = x.read().decode('utf-8')
       dane = json.loads(txt)

W pierwszej wersji kodu użyłem metody close() i też bez efektu.
Zapisane
« Odpowiedz #3 : 16:43 08/02/19 »
Guaz Offline
Professional Python User

Zobacz profil
***

Reputacja: 53
Płeć: Mężczyzna
Wiadomości: 412


A dla jakich dat próbujesz to wydobyć?
Bo na przykład, na stan obecny, ostatnią datą którą widzę że jest dostępna to:
https://api.nbp.pl/api/cenyzlota/2019-01-28/?format=json
Wcześniejsze to error 404 Not Found Error [Przynajmniej u mnie, mylę się?], może zbyt wczesną bierzesz albo gdzieś formatowanie strzela przy nowej wybranej dacie (skoro dzisiejsza działa)?

Troszkę za mało informacji by móc jednoznacznie pomóc Uśmiech .
W tym fragmencie jako tako błędu na moje oko nie ma. Więc stawiam na jakieś trywialne przeoczenie które każdemu się zdarza Chichot

[Resztę można uzyskać z jakiegoś google restore'a albo innego narzędzia przechowującego dane z sieci ;d]
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
« Odpowiedz #4 : 20:24 08/02/19 »
piotrekk10 Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 6


ajajaj... masz rację! Daty wpisywałem prawidłowe, ale błąd tkwi jednak w innym miejscu  Z politowaniem. Przed chwilą sprawdziłem jak zmienna adres wygląda po edycji i okazało się, że formatowanie ucieka linijkę niżej:

Kod
http://api.nbp.pl/api/exchangerates/tables/A/2019-01-08
/?format=json

I teraz pozostało mi uporać się z tym problemem. Na razie kombinuję z urllib-em. Jeśli masz jakąś wskazówkę, z chęcią skorzystam Uśmiech
Zapisane
« Odpowiedz #5 : 00:11 09/02/19 »
raydeal Offline
Professional Python User

Zobacz profil
***

Reputacja: 80
Wiadomości: 476


Najlepiej jest zamykać połączenie po pobraniu danych, a błąd masz dlatego że go nie zamykasz więc robi to serwer.
Kod powinien wyglądać mnie więcej tak:
Kod
with request.urlopen(adres) as f:
   nbp_data = f.read().decode('utf-8')
 
"With" spowoduje że połączenie zostanie zamknięte automatycznie po zakończeniu tego bloku, więc w zasadzie jedna linijka w nim wystarcza, bo potem dane już masz w zmiennej "nbp_data" i z niej korzystasz, więc nie potrzebujesz otwartego połączenia z serwerem.
Zapisane
« Odpowiedz #6 : 02:11 09/02/19 »
piotrekk10 Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 6


Dziękuję, na pewno skorzystam tylko przed tym muszę uporać się z tym adresem. Nie wiem czemu ta druga część ucieka linijkę niżej.
Zapisane
« Odpowiedz #7 : 10:34 09/02/19 »
Guaz Offline
Professional Python User

Zobacz profil
***

Reputacja: 53
Płeć: Mężczyzna
Wiadomości: 412


Jeśli nie jest to sekretnym kluczem do Pentagonu ( Mrugnięcie ) możesz tu wrzucić kod którym generujesz adres, może będziemy w stanie pomóc, chyba że odnajdziesz dlaczego tak się dzieje Chichot.
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
« Odpowiedz #8 : 12:41 09/02/19 »
piotrekk10 Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 6


hahaha  Duży uśmiech
tekst jest pobierany z textboxa (do którego wpisuję dane) za pomocą metody:

Kod
def zmiana_wybrana():
   global wybrana_data
   wybrana_data = f'{wysw_date_text.get(0.0, "end")}'

Zmienna wybrana_data przybiera nową wartość i program powinien pobierać dane ze zmienionego adresu, ale output wygląda tak jak w moim poprzednim poście.

Zapisane
« Odpowiedz #9 : 12:54 09/02/19 »
Guaz Offline
Professional Python User

Zobacz profil
***

Reputacja: 53
Płeć: Mężczyzna
Wiadomości: 412


Rozumiem że to `wysw_date_text.get(0.0, "end")` jest zmienna typu Tk.Entry (albo coś podobnego z innego GUI) które w wyniku kończy się nową linią?

Spróbuj w ten sposób:
Kod
    wybrana_data = f'{wysw_date_text.get(0.0, "end")}'.rstrip()
To powinno usunąć białe znaki z końca wiersza.

Jeśli używasz windowsa i nie będzie to działać, zależnie od wersji windy lubi robić kwiatki z `nową linią i powrotem karetki`. Wtedy możesz dać argument do `rstrip("\n\r")`.

Opcjonalnie sam .strip() też mógłby zabezpieczyć przed niechcianą spacją z lewej strony.

W ostateczności da się też tak:
Kod
    wybrana_data = f'{wysw_date_text.get(0.0, "end")}'[:-1]

Powinno zadziałać, jak nie zaskoczy w żaden sposób to spróbujemy czegoś innego Uśmiech.
Ale sprawdź co wyrzuca ta zmienna po każdej próbie printem:
Kod
 print("/", wybrana_data, "/")
Slash'e pokażą ci gdzie w rzeczywistości się kończy ten string.
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
« Odpowiedz #10 : 16:57 09/02/19 »
piotrekk10 Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 6


Pierwszy sposób zadziałał Uśmiech bardzo dziękuję wszystkim za pomoc!

Zapisane
Strony: [1]   Do góry
Drukuj
Skocz do:  

© 2007 - 2019 Polish Python Coders Group
Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | Theme by PixelSlot