Итак, в Python я пытаюсь извлечь данные из файла csv, используя модуль csv (для обработки данных в файле csv проклятия), у меня есть следующее:
import csv
with open('GDMTH_CSV.csv')as csv_file:
csv_file_read = csv.reader(csv_file)
for line in csv_file_read:
print(line)
а затем я получаю необработанные данные, поэтому я соответствующим образом изменяю их, чтобы получить конкретные данные, которые мне нужны.
но на самом деле GDMTH_CSV.csv - это файл в сети, поэтому я использую модуль urllib.request, чтобы попробовать то же самое:
import urllib.request
import csv
url='http://www.cre.gob.mx/da/TarifasFinalesdeSuministroBasico.csv'
x = urllib.request.urlopen(url)
csv_read = csv.reader(x)
for line in csv_read:
print(line)
(Кстати, имя файла на самом деле «TarifasfinalesdeSuministroBasico.csv»), но это дает мне ошибку «Итератор должен возвращать строки, а не байты, вы открывали файл в текстовом режиме?», Поэтому я рассуждаю: «О, это в байтах; я должен просто расшифруй это ", поэтому я меняю
x = urllib.request.urlopen(url)
к
x = urllib.request.urlopen(str(url))
Но в результате я получаю каждый символ файла в квадратных скобках. Думаю, я до сих пор не могу понять типы данных и списки в Python. Как мне получить результат, аналогичный первому коду?
конструктор str не декодирует байты, поэтому лучше использовать вместо него метод decode. codec.iterdecode хорош для чтения больших файлов, когда требуется память.






Объект, возвращаемый urllib.request.urlopen, не подходит для передачи csv.reader(), поскольку эта функция ожидает итератора. Кроме того, я бы рекомендовал использовать более простую библиотеку requests для HTTP-взаимодействий более высокого уровня. Следующие должны успешно получить данные:
(Обратите внимание, что я декодирую последовательность байтов как iso-8859-1, поскольку это кодировка этого конкретного файла csv)
import csv
import requests
url = 'http://www.cre.gob.mx/da/TarifasFinalesdeSuministroBasico.csv'
res = requests.get(url)
content = res.content.decode('iso-8859-1')
for line in csv.reader(content.splitlines()):
print(line)
Вывод:
['', 'División', '', '', '', '', 'Baja California', '', '', '', '', '', '', '', '', 'Baja California Sur', '', '', '', '', '', '', '', '', 'Bajio', '', '', '', '', '', '', '', '', 'Centro Occidente', '', '', '', '', '', '', '', '', 'Centro Oriente', '', '', '', '', '', '', '', '', 'Centro Sur', '', '', '', '', '', '', '', '', 'Golfo Centro', '', '', '', '', '', '', '', '', 'Golfo Norte', '', '', '', '', '', '', '', '', 'Jalisco', '', '', '', '', '', '', '', '', 'Valle de México Centro', '', '', '', '', '', '', '', '', 'Valle de Mexico Norte', '', '', '', '', '', '', '', '', 'Valle de México Sur', '', '', '', '', '', '', '', '', 'Noroeste', '', '', '', '', '', '', '', '', 'Norte', '', '', '', '', '', '', '', '', 'Oriente', '', '', '', '', '', '', '', '', 'Peninsular', '', '', '', '', '', '', '', '', 'Sureste', '', '', '', '', '', '', '', '']
['Mes', 'Tarifa', 'Descripción', 'Int. Horario', 'Cargo', 'Unidades', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL', 'Transmisión', 'Distribución', 'CENACE', 'Suministro', 'SCnMEM', 'Generación', 'Capacidad', 'Pérdidas', 'TOTAL']
...
Я пометил свой вопрос как дубликат, прежде чем увидел ваш ответ, это более элегантно и просто, кстати, я закодировал кодеком latin_1, полагаю, это saqme @cody
Я полагаю, это решает проблему, но я не понимаю, почему 'str ()' не дает того же результата, что 'codec.iterdecode ()', у меня такое ощущение, что это что-то Ооочень простое. Я искал похожие вопросы, прежде чем задать свой собственный, полагаю, я не много искал. Спасибо, в любом случае.