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



Python 2.7.14 |股份有限公司Anaconda | 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中搜索类似的解决方案,但没有找到一个能给我答案的解决方案。

有人能帮助我理解为什么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,然后在加载((时使用它。然而,看起来读起来f变了f?

好的,我在这里找到了这个话题的答案

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

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

如果确实具有(字节(字符串中的数据,请使用loads

最新更新