[=10p) 和 pickle.load(urllib.open(link)) 之间的区别

difference bwtween pickle.load(p) versus pickle.load(urllib.open(link))

Python 2.7.14 |蟒蛇公司| IPython5.4.1

我不明白为什么根据我给 pickle 参数的方式,我得到了想要的结果或错误 请看一下这个例子:

import urllib
import pickle

p= pickle.load(urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p"))

link='http://www.pythonchallenge.com/pc/def/banner.p'
q= pickle.load(urllib.urlopen(link))

我得到了 p 和 q 的数据(列出 23 个元素)

然而, 如果我尝试:

   f = urllib.urlopen(link)   
   r= pickle.load(f)

我得到:

raise EOFError

如果我尝试:

myfile = f.read()
s= pickle.load(myfile)

我得到:

AttributeError: 'str' object has no attribute 'readline'

我在 SO 中搜索类似的解决方案,但未能找到可以给我答案的解决方案。

谁能帮我理解为什么 r 和 s 失败了,而 q 和 f 在我看来是一样的?

******编辑以回应 DAVIS HERRING ********

import urllib
import pickle

link="http://www.pythonchallenge.com/pc/def/banner.p"
f = urllib.urlopen(link)   
#myfile = f.read()

r= pickle.load(f)

删除 myfile = f.read(),使 r 工作。你是对的!现在我明白了你的回答,我无法读取 f 然后在 load() 上使用它。但是,它看起来读取 f 更改 f?

好的,我找到了关于这个话题的答案here

不影响 pickle.loadname (f) 附加或不附加到 urllib.urlopen(link) 返回的文件对象. (附加名称确实有另一个好处,那就是您可以 close 正确地使用 with,而不是自动且不可靠。)

但是,返回的是 stream——数据的 source 而不是 container 它的。它不能 read 两次(或 readloaded)因为它不存储任何东西的副本(这对于大型 files/pages 很重要) .

如果你有一个(字节)字符串的数据,使用loads.