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主题的答案
答案 0 :(得分:1)
在pickle.load
返回的文件对象上附加或不附加名称(f
)不会影响urllib.urlopen(link)
。 (附加名称确实有另一个优点,那就是您可以close
正确使用with
而不是自动且不可靠地使用它。)
但是,返回的是流-数据的源而不是数据的容器。不能两次read
(或read
,也load
),因为它不存储任何内容的副本(这对于大文件/页面很重要)。 / p>
如果要做以(字节)字符串中包含数据,请使用loads
。