Как предотвратить cookie JSESSIONID от кодирования в заголовке HTTP-запроса

Проблема связана с возвратом байтов 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

Обратите внимание, что список не создается по той же причине.

0
задан Community 26 February 2015 в 14:49
поделиться