При чтении zipfile шейп файла из URL, ошибка для начального значения не str - PullRequest
1 голос
/ 12 марта 2019

Использование Python 3.5, следующий пример для чтения zipfile шейп-файла из URL и обновления для P3.5. Код ниже. Я посмотрел на другие случаи и попытался добавить .decode ('utf-8'), и это не помогает.

    dls = "https://github.com/ItsMeLarry/Coursera_Capstone/raw/master/tl_2010_25009_tract00%202.zip"
print('Downloading shapefile...')
lynntracts = ZipFile(io.StringIO(urllib.request.urlopen(dls).read()))
print("Done")

Код ошибки: TypeError: initial_value должно быть str или None, а не байтами

Если я введу .decode ('utf-8'), аля:

lynntracts = ZipFile(io.StringIO(urllib.request.urlopen(dls).read().decode('utf-8')))

Я получаю следующее сообщение: UnicodeDecodeError: кодек «utf-8» не может декодировать байт 0xa4 в позиции 57: недопустимый начальный байт

Помещение decode () снаружи вызова io.StringIO не влияет на исходную проблему. Я потерялся. Что я могу попробовать или что мне нужно учиться? Спасибо.

Кроме того, я пытаюсь реализовать процедуру, которая не создает файл на диске, временную или другую, потому что отношения между Jupyter и Macos запрещают доступ к файлам на диске. Это еще одна проблема, которую еще никто не смог решить.

1 Ответ

1 голос
/ 12 марта 2019
import urllib.request
import io
from zipfile import ZipFile

dls = "https://github.com/ItsMeLarry/Coursera_Capstone/raw/master/tl_2010_25009_tract00%202.zip"
print('Downloading shapefile...')
lynntracts = ZipFile(io.BytesIO(urllib.request.urlopen(dls).read())) -----> Edited Line
print("Done")

Вместо этого используйте BytesIO.

StringIO принимает строку, в то время как передаваемые вами данные являются байтами.

...