Проблема связана с возвратом байтов urllib
. В качестве доказательства вы можете попробовать загрузить файл csv с помощью своего браузера и открыть его как обычный файл, и проблема исчезла.
Аналогичная проблема была рассмотрена здесь здесь .
Можно решить декодирование байтов в строки с соответствующим кодированием. Например:
import csv
import urllib.request
url = "ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/file_list.csv"
ftpstream = urllib.request.urlopen(url)
csvfile = csv.reader(ftpstream.read().decode('utf-8')) # with the appropriate encoding
data = [row for row in csvfile]
Последняя строка также может быть: data = list(csvfile)
, которую легче читать.
Кстати, поскольку файл csv очень велик, может замедляться и потреблять память. Возможно, было бы предпочтительнее использовать генератор.
EDIT: Использование кодеков, предложенных Стивеном Румбальским, поэтому нет необходимости читать весь файл для декодирования.
import csv
import urllib.request
import codecs
url = "ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/file_list.csv"
ftpstream = urllib.request.urlopen(url)
csvfile = csv.reader(codecs.iterdecode(ftpstream, 'utf-8'))
for line in csvfile:
print(line) # do something with line
Обратите внимание, что список не создается по той же причине.