我正在尝试访问天气api数据。它返回一条较长的人类可读的单行。我试图用'{/ n'替换每个括号({),以便括号保留,但是为了更好的可读json,还有一个新行符号。 但它返回shell中新行的每个字符。
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
答案 0 :(得分:3)
问题在于:
for line in s:
print line
此时,它将在一个单独的行上打印每个字符 - 这就是打印的作用(它为每个打印命令添加了一个尾随换行符),如下代码所示:
print 1
print
print 2
输出:
1
2
您可能会对名称line
感到困惑,但它不是特殊的变量名称。您可以将字线更改为任何有效的变量名称,它将以相同的方式工作。
for循环将迭代迭代。如果它是一个文件,它将执行每一行。列表将是每个元素,并且字符串遍历每个字符。因为你说打印它然后单独打印它们。
您是否期望来自API的非字符串响应?如果它给出这样的列表:
["calls=10","message=hello"]
然后你的for循环将依次打印每个。但如果它只是一个字符串,如"message=hello"
,它将打印每个字符。
{
之后是否有空白换行符?因为replace
命令工作正常。
答案 1 :(得分:3)
为什么不使用Python中标准的json库的内置功能?
{
"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"
}
输出:
{{1}}
答案 2 :(得分:1)
s
只是一个字符串,因此for x in s
实际上会迭代s
的单个字符,而不是其行。当for line in f
是文件对象时,我认为您将其与f
混淆了!