разница между pickle.load (p) и pickle.load (urllib.open (ссылка)) - PullRequest
0 голосов
/ 02 декабря 2018

Python 2.7.14 | Anaconda, Inc. |IPython 5.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 выглядят одинаково для меня?

****** РЕДАКТИРОВАНО НА ОТВЕТ ДЭВИС ГЕРРИНГ ********

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?

Хорошо, я нашел ответ на эту тему здесь

1 Ответ

0 голосов
/ 05 декабря 2018

Не влияет pickle.load на присоединение или не прикрепление имени (f) к объекту файла, возвращаемому urllib.urlopen(link).(Присоединение имени имеет еще одно преимущество: вы можете close правильно его использовать - использовать with - иначе, чем автоматически и ненадежно.)

Однако возвращается поток - источник данных, а не контейнер их.Он не может быть read дважды (или read, а также load ed), потому что он не хранит копию чего-либо (что может быть важно для больших файлов / страниц).

Еслиу вас до есть данные в виде (байта) строки , используйте loads.

...