2015-05-19 72 views
1

我试图通过Python读取API调用的结果,我使用基本应用程序/脚本作为起点。使用Python澄清读取API结果

我有点在脚本中的一个点混淆,其中读取操作发生:

result=urllib2.urlopen.read()[13:-1] 
        if result=="true": 
          logging.info('available') 

我的问题与13:-1专门处理。根据Python documentation,它似乎是应用程序读取的偏移或起点。下面是给出一个例子:

>>> f.seek(-3, 2) # Go to the 3rd byte before the end 

这看起来与.read()稍有不同在我的脚本在我的分隔符是一个:而非,

为了阐明它正在阅读的内容,我使用了Ello API作为示例。因此,它会读取产生的结果看起来像这样的链接:

{ 
available: true, 
suggestions: [ 
"crunchyfeelsfists", 
"crunchy_nicksshakes", 
"supercrunchy" 
] 
} 

所以我使用的示例脚本读取“可用:真正的”行。

我的第一个问题是,使用:,之间的区别是什么。我的下一个问题是,13:-1如何读取API结果的第二行?

任何帮助,将不胜感激!

+0

*使用:和*之间有什么区别,它们没有任何关系,也不能用这种方式进行比较。一个是函数调用,另一个是列表分片操作 –

回答

1

方括号中的数组表示法与read()返回的数据有关,而不是作为seek()的参数。 [13:-1]表示从第13个字节开始停止,倒数第二个字节。

它跳过响应数据(“available:”)和逗号(最后一个字节),查看响应是否为“true”。

4

你不应该通过json响应对象手动寻找那样的东西。你应该使用JSON内置库

只是做

data = json.loads(urllib2.urlopen.read()) 
print data["available"] 
print data["suggestions"] 
... 

特别是因为有可能很少或几乎没有保证,“可用”总是会在JSON响应第一个关键输出(因为字典本身不支持订购)

或者干脆使用请求库

data =requests.get(my_endpoint,data=my_data,headers=my_header).json() 

我知道这并没有解决OP的原切片的问题(其他答案解决就好了)

0

略有改善@Joran Beasley将处理异常:

try: 
    data = json.loads(urllib2.urlopen.read()) 
    print data.get('avaiable', 'A default value if available wasnt passed') 
    # etc etc 
except ValueError: 
    print "JSON Decoding failed. No data." 
0

[:]语法表示切片。有关切片的更多信息,请参阅Explain Python's slice notation上的@Greg Hewgill回答。切片的结果是返回给您的。

至于切片和(,)语法之间的区别:

Python documentation

要更改文件对象的位置,使用f.seek(偏移,from_what)。 该位置是通过将偏移量添加到参考点来计算的; 参考点由from_what参数选择。一个from_what 值从文件的开头开始,1使用当前的 文件位置,2使用文件的结尾作为参考点。 from_what可以省略,默认为0,以 文件的开头为参考点。

在这方面.seek()是需要两个参数offsetfrom_what的方法。当您调用某个方法时,可以使用,来分隔参数。