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
(或read
和load
ed(,因为它不存储任何内容的副本(这对大文件/页面可能很重要(。
如果确实具有(字节(字符串中的数据,请使用loads
。