pickle.load(p)与pickle.load(urllib.open(link))之间的差异

时间:2018-12-02 15:29:09

标签: python pickle

Python 2.7.14 | Anaconda,Inc. | IPython 5.4.1

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

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中寻找类似的解决方案,但没有找到可以给我答案的解决方案。

当q和f在我看来相同时,谁能帮助我理解r和s为何失败?

******编辑为回复戴维斯鲱鱼********

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主题的答案

1 个答案:

答案 0 :(得分:1)

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

但是,返回的是-数据的而不是数据的容器。不能两次read(或read,也load),因为它不存储任何内容的副本(这对于大文件/页面很重要)。 / p>

如果要做以(字节)字符串中包含数据,请使用loads