2017-01-18 4 views
0

Мой нынешний профессор использует Python 2.7 для примеров в классе, но другие профессора, с которыми я буду проводить занятия в будущем, предположили, что я использую Python 3.5. Я пытаюсь преобразовать примеры моего нынешнего профессора с 2,7 до 3,5. Сейчас у меня проблема с пакетом urllib2, который я понимаю, был разделен на Python 3.Как я могу обновить этот код, используя urllib2 для Python3?

Исходный код в блокноте IPython выглядит следующим образом:

import csv 
import urllib2 

data_url = 'http://archive.ics.uci.edu/ml/machine-learning- databases/adult/adult.data' 
response = urllib2.urlopen(data_url) 

myreader = csv.reader(response) 
for i in range(5): 
    row = next(myreader) 
    print ','.join(row) 

Что я превращал в :

import csv 
import urllib.request 

data_url = 'http://archive.ics.uci.edu/ml/machine-learning- databases/adult/adult.data' 
response = urllib.request.urlopen(data_url) 
myreader = csv.reader(response) 
for i in range(5): 
    row = next(myreader) 
    print(','.join(row)) 

Но это оставляет меня с ошибкой:

Error          Traceback (most recent call last) 
<ipython-input-19-20da479e256f> in <module>() 
     7 myreader = csv.reader(response) 
     8 for i in range(5): 
----> 9  row = next(myreader) 
    10  print(','.join(row)) 

Error: iterator should return strings, not bytes (did you open the file in text mode?) 

Я неуверенный, как исходить отсюда. Есть идеи?

+0

ли вы рассмотрите возможность использования пакета ['запросов'] (http://docs.python-requests.org/en/master/)? – MYGz

+0

Вам нужно преобразовать 'bytes', возвращаемые' urlopen' в 'str'. '.decode()' делает это. Взгляните на: http://stackoverflow.com/questions/6224052/what-is-the-difference-between-a-string-and-a-byte-string. –

+1

Возможный дубликат [Читать .csv-файл из URL-адреса в Python 3.x - \ _csv.Error: iterator должен возвращать строки, а не байты (вы открыли файл в текстовом режиме?)] (Http://stackoverflow.com/ Вопросы/18897029/read-csv-file-from-url-in-python-3-x-csv-error-iterator-should-return-str) – theodor

ответ

1

Wrap response с другой итератор, который расшифровывает байты строки и дают строки:

import csv 
import urllib.request 

def decode_iter(it): 
    # iterate line by line 
    for line in it: 
     # convert bytes to string using `bytes.decode` 
     yield line.decode() 

data_url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data' 
response = urllib.request.urlopen(data_url) 
myreader = csv.reader(decode_iter(response)) 
for i in range(5): 
    row = next(myreader) 
    print(','.join(row)) 

UPDATE

Вместо decode_iter, вы можете использовать codecs.iter_decode:

import csv 
import codecs 
import urllib.request 

data_url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data' 
response = urllib.request.urlopen(data_url) 
myreader = csv.reader(codecs.iterdecode(response, 'utf-8')) 
for i in range(5): 
    row = next(myreader) 
    print(','.join(row)) 
+0

Что такое по умолчанию для '.decode()'? ' 'UTF-8''? –

+1

@ Ev.Kounis, в Python 3.x, 'utf-8'. См. Http://docs.python.org/library/stdtypes#bytes.decode. – falsetru

Смежные вопросы