2015-09-12 2 views
0

Я пытаюсь получить доступ к данным погоды api. Он возвращает длинную, менее понятную человеку одну строку. Я пытаюсь заменить каждую скобку ({) на '{/ n', чтобы скобка оставалась, но также и новый символ линии только для лучшего читаемого json. Но он возвращает каждый символ в новой строке в оболочке.Невозможно отформатировать вывод ссылки в python

import urllib2 

url2 = 'http://api.openweathermap.org/data/2.5/find?q=london,PK&units=metric' 
data = urllib2.urlopen(url2) 
s = data.read() 
count = 0 
s = s.replace('{',"{\n") 
#s = ''.join(s) 
for line in s: 
    print line 
    count = count + 1 
print count 

после присоединения() проблема по-прежнему сохраняется. Проблематика выход после этого кода, как этот enter image description here

ответ

3

Почему вы не используете встроенные возможности библиотеки json, которая является стандартной в Python?

import urllib2 
import json 

url2 = 'http://api.openweathermap.org/data/2.5/find?q=london,PK&units=metric' 
data = urllib2.urlopen(url2) 

# read the contents in and parse the JSON. 
jsonData = json.loads(data.read()) 

# print it out nicely formatted: 
print json.dumps(jsonData, sort_keys=True, indent=4, separators=(',', ': ')) 

выход:

{ 
    "cod": "200", 
    "count": 1, 
    "list": [ 
     { 
      "clouds": { 
       "all": 20 
      }, 
      "coord": { 
       "lat": 38.7994, 
       "lon": -89.9603 
      }, 
      "dt": 1442072098, 
      "id": 4237717, 
      "main": { 
       "humidity": 67, 
       "pressure": 1020, 
       "temp": 16.82, 
       "temp_max": 18.89, 
       "temp_min": 15 
      }, 
      "name": "Edwardsville", 
      "sys": { 
       "country": "United States of America" 
      }, 
      "weather": [ 
       { 
        "description": "few clouds", 
        "icon": "02d", 
        "id": 801, 
        "main": "Clouds" 
       } 
      ], 
      "wind": { 
       "deg": 350, 
       "speed": 4.6 
      } 
     } 
    ], 
    "message": "accurate" 
} 
+0

То, что я пытался сделать. Распечатайте его в удобном формате. –

3

вопрос здесь:

for line in s: 
    print line 

На данный момент, он будет печатать каждый символ в отдельной строке - это то, что делает печать (это добавляет завершающую перевод строки к каждой команде печати), как показано на этом коде:

print 1 
print 
print 2 

, который выводит этот:

1 

2 

Вы можете быть смущены с именем line, но это не специальное имя переменной. Вы можете изменить строку слова на любое допустимое имя переменной, и она будет работать одинаково.

Цикл for будет перебирать итерацию. Если это файл, он будет делать каждую строку. Каждому элементу будет список, и строка будет передаваться каждому символу. Поскольку вы говорите, что хотите распечатать его, он печатает их по отдельности.

Ожидаете ли вы нестроковый ответ API? Если он дает такой список:

["calls=10","message=hello"] 

тогда ваш цикл будет печатать каждый по очереди. Но если это всего лишь строка, например "message=hello", она будет печатать каждый символ.


И причина есть пустой символ новой строки после {? Потому что команда replace работает нормально.

+0

удаления для и только с помощью одного 'Печатает S' оператор решил эту проблему. Великий. Я новичок в python. –

+0

@UmerTahir если это помогло, пожалуйста, не забудьте нажать серый тик под стрелкой вниз, сбоку! Он будет отмечать этот вопрос как решаемый. – Tim

+0

Как я уже подтвердил свой ответ. Мой следующий голос ожидал минутной очереди. Я новичок в stackoverflow, но они не позволяют мне голосовать быстро. Теперь я могу проверить это. –

1

s всего лишь строка, поэтому for x in s фактически выполняет итерации по отдельным символам s, а не по его линиям. Я думаю, вы путаете его с for line in f, когда f является файловым объектом!

Смежные вопросы