2017-10-20 17 views
0

J'essaie de créer une application CLI simple pour récupérer les données météorologiques. Malheureusement je ne suis pas allé très loin avec ça parce que je suis bloqué à un stade précoce. Ceci est mon code à ce jour:Obtenir l'ID de l'emplacement à partir de l'entrée de l'utilisateur avec pywapi

import pywapi, string 

loc=input("What is the city you're closest to?") 
loc=loc.lower 

#this will give you a dictionary of all cities in the world with this city's name Be specific (city, country)! 
loc_id=pywapi.get_location_ids(loc) 
#apparently this is a needed workaround to access last item of dictionary 
for i in loc_id: 
    loc_id=i 

#before I go on to code anything further, I just want to use print to check that I've got the two variables I need 
print (loc,loc_id) 

Quand on vous demande une ville, je pourrais entrer à Londres par exemple, ou Londres, Royaume-Uni, mais les deux vomir une erreur: (ce qui est sur ma machine locale)

Traceback (most recent call last): 
    File "get_weather.py", line 7, in <module> 
    loc_id=pywapi.get_location_ids(loc) 
    File "/home/james/.local/lib/python3.4/site-packages/pywapi.py", line 825, in get_location_ids 
    loc_id_data = get_loc_id_from_weather_com(search_string) 
    File "/home/james/.local/lib/python3.4/site-packages/pywapi.py", line 856, in get_loc_id_from_weather_com 
    url = LOCID_SEARCH_URL % quote(search_string) 
    File "/usr/lib/python3.4/urllib/parse.py", line 694, in quote 
    return quote_from_bytes(string, safe) 
    File "/usr/lib/python3.4/urllib/parse.py", line 719, in quote_from_bytes 
    raise TypeError("quote_from_bytes() expected bytes") 
TypeError: quote_from_bytes() expected bytes 

Et cette erreur, ce qui est différent, est quand je me sers Pythonanywhere

Traceback (most recent call last): 
    File "/home/pydavith/get_weather.py", line 7, in <module> 
    loc_id=pywapi.get_location_ids(loc) 
    File "/home/pydavith/.local/lib/python3.6/site-packages/pywapi.py", line 825, in get_location_ids 
    loc_id_data = get_loc_id_from_weather_com(search_string) 
    File "/home/pydavith/.local/lib/python3.6/site-packages/pywapi.py", line 852, in get_loc_id_from_weather_co 
m 
    search_string = unidecode(search_string) 
    File "/usr/local/lib/python3.6/dist-packages/unidecode/__init__.py", line 48, in unidecode_expect_ascii 
    bytestring = string.encode('ASCII') 
AttributeError: 'builtin_function_or_method' object has no attribute 'encode' 

est-ce que quelqu'un a une idée de ce qui ne va pas ici? J'ai fait du canard et ai beaucoup googlé, mais rien n'est apparu. L'aide serait appréciée!

+0

vous utilisez deux versions différentes de python (3.4 et 3.6), ce qui pourrait expliquer pourquoi les deux sont différents, sinon les erreurs elles-mêmes ... – hwjp

Répondre

0

D'accord, je suis venu à une réponse réalisable moi-même. Je partage le code ici juste au cas où cela aiderait quelqu'un d'autre.

Il y a tellement de choses que j'ai changé ici qu'il est difficile de savoir par où commencer. C'est-à-dire, il y avait beaucoup d'erreurs et d'améliorations nécessaires dans le code que j'ai initialement posté.

import pywapi 

# getting input from the user regarding location 
#this will give a dictionary of all cities in the world with this city's name 
loc=str.title(input("What is the city you're closest to? ")) 
print("Searching for ", loc) 
loc_id=pywapi.get_location_ids(loc) 
#Now we have a dictionary (it seems as standard it returns a maximum of ten key:value pairs. Now to convert it to a list just so I can number the entries and ultimately allow the user select the correct entry easily. (Note, there may be a way to do this without converting the dictionary to a list, but I couldn't find it) 
loc_list = [ [k,v] for k, v in loc_id.items() ] 

#Now I am going to check if the length of the list is over 1 value (i.e. if there's more than one choice, and if there is, to run a for loop printing each entry with a number 

list_leng=len(loc_list) 
if list_leng >1: 
#fix some value for x and y to be used in the for loop 
    x=1 
    y = 0 
    for l in loc_id: 
     print (x,loc_list[y]) 
     x = x+1 
     y=y+1 
    index_choice=(int(input("Which city do you mean? Enter a choice from 1 to " + str(list_leng) + ": ")))-1 
else: 
    index_choice=0 


loc_id=loc_list[index_choice] 
print("You selected ",loc_id[1]) 
loc_id=loc_id[0] 

print ("Location ID for "+loc+" is ",loc_id) 

def gettt_weather(loc_id): 
    """Fetches the weather information from Weather.com using a location stored under the variable loc_id""" 
    print("Looking up the weather for "+loc) 
    weather_com_result = pywapi.get_weather_from_weather_com(loc_id,units='metric') 
    print ("Weather.com says that it is "+ weather_com_result['current_conditions']['text'].lower()+" and", weather_com_result['current_conditions']['temperature']+"°C now in " + loc) 

gettt_weather(loc_id) 

Quoi qu'il en soit cela fonctionne comme je le voulais, donc j'espère que ce utile à certains débutants quelque part. Si quelqu'un a d'autres améliorations s'il vous plaît faites le moi savoir.