如何将使用urllib2.urlopen检索的二进制plist操作为可读的xml plist,而不使用Python将文件保存在本地?

如何将使用urllib2.urlopen检索的二进制plist操作为可读的xml plist,而不使用Python将文件保存在本地?,python,Python,我们使用Python脚本与DeployStudio服务器通信,以使用DeployStudio的web访问URL自动更新用户和计算机信息。由于最近的变化,他们现在以二进制plist格式(而不是XML)存储计算机的plist 以下是当前与旧版本DS(源代码:)一起使用的内容: 我们将其与自主开发的web界面结合使用,以便技术人员在重新成像机器时输入信息,并自动更新DS数据库中的信息 我试过使用诸如的库,但没有用。我希望不必在服务器上本地存储该文件,然后使用bash命令对其进行转换。我是否可以操纵存储

我们使用Python脚本与DeployStudio服务器通信,以使用DeployStudio的web访问URL自动更新用户和计算机信息。由于最近的变化,他们现在以二进制plist格式(而不是XML)存储计算机的plist

以下是当前与旧版本DS(源代码:)一起使用的内容:

我们将其与自主开发的web界面结合使用,以便技术人员在重新成像机器时输入信息,并自动更新DS数据库中的信息

我试过使用诸如的库,但没有用。我希望不必在服务器上本地存储该文件,然后使用bash命令对其进行转换。我是否可以操纵存储信息的变量?在这种情况下,它将是“机器数据”

我已经成功地使用bash命令curl和-o标志来指示将文件保存为.plist文件,该文件可以工作,但是正如前面所说的,如果可能的话,我希望不在本地保存文件


部署可用的Studio web服务:。

只需将@martijn pieters的所有评论汇总成一个答案:

pip安装biplist

import urllib2
import io
import biplist

sock = urllib2.urlopen('https://cfpropertylist.googlecode.com/svn/trunk/examples/sample.binary.plist' )
buf = io.BytesIO(sock.read())
xml = biplist.readPlist(buf)
print xml
输出:


{‘宠物名称’:[],'Name':'John Doe','Picture':'是否可以获取上面示例中的变量machine_data并使用新的加载函数,或者这只对物理文件起作用,因此迫使我首先在本地存储二进制数据?如果不必这样做,这就是我试图避免的。那么,
biplist.readPlistFromString()为什么会这样做呢
不适用于您?请注意,
biplist.readPlistFromString()
plistlib.loads()
只需在内存中创建一个
io.BytesIO
文件对象来包装数据。任何只接受文件对象的库都可以以相同的方式接受内存数据。@BcnDoge:是的,但您可以使用
io.BytesIO()
对象仍然存在。
urllib
的返回值不是可查找的类似文件的对象,而是
io.BytesIO()
是。@BcnDoge:
BytesIO(response.read())
。谢谢!这确实回答了问题,并允许我操作数据。但是,我确实需要弄清楚如何搜索特定记录,更新部分数据,然后以正确的格式重新提交数据,以便DS数据库读取。您可以查看JSONPath的python实现,以获得高级搜索在JSON构造上使用ng,或者在解析dict对象后仅对其进行操作。您始终可以发布更多后续问题(在您尝试了这些东西但不起作用之后!):)
import urllib2
import io
import biplist

sock = urllib2.urlopen('https://cfpropertylist.googlecode.com/svn/trunk/examples/sample.binary.plist' )
buf = io.BytesIO(sock.read())
xml = biplist.readPlist(buf)
print xml