[=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.load
将 name (f
) 附加或不附加到 urllib.urlopen(link)
返回的文件对象. (附加名称确实有另一个好处,那就是您可以 close
正确地使用 with
,而不是自动且不可靠。)
但是,返回的是 stream——数据的 source 而不是 container 它的。它不能 read
两次(或 read
和 load
ed)因为它不存储任何东西的副本(这对于大型 files/pages 很重要) .
如果你做有一个(字节)字符串的数据,使用loads
.
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.load
将 name (f
) 附加或不附加到 urllib.urlopen(link)
返回的文件对象. (附加名称确实有另一个好处,那就是您可以 close
正确地使用 with
,而不是自动且不可靠。)
但是,返回的是 stream——数据的 source 而不是 container 它的。它不能 read
两次(或 read
和 load
ed)因为它不存储任何东西的副本(这对于大型 files/pages 很重要) .
如果你做有一个(字节)字符串的数据,使用loads
.