Как преобразовать cp1252 в UTF-8 при экспорте файла csv с использованием Python

У меня возникла ошибка Unicode, когда я попытался экспортировать файл CSV (веб-парсинг, я использую Beautifulsoup и импортировал как CSV, так и Beautifulsoup). Код используется Mac Linux, который вполне поддерживает UTF-8, но я использую Windows. Ошибка отображается как

> UnicodeEncodeError Traceback (most recent call last) in () 71
> 'ranking_title': ranking_title, ---> 72 'ranking_category':
> ranking_category}) 73
> 
> ~\Anaconda3\lib\csv.py in writerow(self, rowdict) 154 def
> writerow(self, rowdict): --> 155 return
> self.writer.writerow(self._dict_to_list(rowdict)) 156
> 
> ~\Anaconda3\lib\encodings\cp1252.py in encode(self, input, final) 18
> def encode(self, input, final=False): ---> 19 return
> codecs.charmap_encode(input,self.errors,encoding_table)[0] 20
> 
> UnicodeEncodeError: 'charmap' codec can't encode characters in
> position 299-309: character maps to

Исходный код, работающий на Mac:

def get_page(url):
    request = urllib.request.Request(url)
    response = urllib.request.urlopen(request)
    mainpage = response.read().decode('utf8')
    return mainpage

Я попытался декодировать cp1252 и закодировать UTF-8 в начале рабочего листа:

def get_page(url):
    request = urllib.request.Request(url)
    response = urllib.request.urlopen(request)
    mainpage = response.read().decode('cp1252').encode('utf8')
    return mainpage

Но это не работает, пожалуйста, помогите.

Похоже, проблема не в том, как вы читаете (декодируете) данные, а в том, как вы их записываете (кодируете, см. Сообщение об ошибке). Функция get_page выглядит нормально, но вы должны показать части кода, в которых вы открываете файл для записи вывода CSV.

lenz 10.09.2018 06:51

можете ли вы указать URL-адрес используемого вами веб-сайта?

Tom 10.09.2018 07:20

@lenz Большое спасибо. Скоро предоставлю. Теперь у меня другая случайная ошибка.

Meekao 10.09.2018 07:40

Угробить urllib.request. Используйте модуль requests. Он выполняет все декодирование за вас, и вы можете сосредоточиться на том, что действительно хотели сделать. (Конечно, вы можете повторно реализовать все, что делает requests, с urllib. Но для начала вам нужно обратить внимание на заголовок ответа Content-Type вместо жесткого кодирования одной кодировки. Но действительно ли это ваша цель здесь, или вы действительно хотите скачать и работать с данными?)

Tomalak 10.09.2018 08:41

@Tomalak, безусловно, прав в том, что requests в целом упрощает вашу жизнь. Боюсь, что это не решит эту конкретную проблему, потому что расшифровка явно преуспевает (нет UnicodeDecodeError). Я подозреваю, что вы open - выходной файл без объявления параметра encoding=, поэтому Python по умолчанию использует кодек по умолчанию для конкретной платформы «CP-1252», который, по-видимому, не поддерживает все символы в ваших данных.

lenz 10.09.2018 09:04

@Tomalak Да, я хочу только загрузить данные. Я новичок в питоне. Не могли бы вы уточнить больше о «Content-Type»?

Meekao 10.09.2018 09:06

@lenz Спасибо. Есть ли у вас какие-либо предлагаемые источники для обучения, чтобы я мог больше узнать о том, как я объявляю кодировку, подходящую для моего рабочего листа.

Meekao 10.09.2018 09:28

@Meekao Не могли бы вы просто использовать модуль requests, как я предлагал?

Tomalak 10.09.2018 09:29

@lenz Почему бы не решить эту проблему? Сервер объявляет кодировку, модуль запросов ее декодирует. Скорее всего, он просто работает (если сервер не отправляет неправильный тип контента, что я бы сейчас исключил).

Tomalak 10.09.2018 09:31

@Meekao Для функции open взгляните на документы. Если вы используете один из кодеков UTF, он будет работать (с их помощью можно кодировать все символы). Если вы планируете позже открыть файл CSV с помощью инструмента Windows, я предлагаю вам использовать «utf-8-sig» или «utf-16».

lenz 10.09.2018 09:33

@Tomalak, потому что похоже, что проблема связана с записью в вывод (CSV), а не с интерпретацией данных. В коде OP нет ошибки декодирования.

lenz 10.09.2018 09:35

Какую версию Python вы используете? И какой инструмент в Windows вы используете для просмотра файла? Например, Notepad ++ полностью поддерживает кодировку utf-8.

Martin Evans 10.09.2018 17:36

@Tomalak Большое спасибо. Я пробовал, но при запуске раздела get_page появляется ошибка атрибута.

Meekao 11.09.2018 08:21

@MartinEvans В настоящее время я использую Python 3 с Jupyter-notebook 5.0.0 от Anaconda Navigator. Я новичок в Python, я ответил на ваш вопрос?

Meekao 11.09.2018 08:36

@Meekao Вы можете отредактировать исходное сообщение, включив в вопрос начало фрагмента 10 (см. Серую ссылку «изменить» под текстом).

lenz 11.09.2018 08:57

Спасибо всем присутствующим, я очень ценю вашу доброту. Ваша поддержка улучшила мою работу и учебу. Еще раз хочу вас поблагодарить! : D: Томалак, МартинЭванс, the-realtom

Meekao 11.09.2018 09:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
16
3 362
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

UnicodeEncodeError, с которым вы сталкиваетесь, возникает, когда вы записываете данные в выходной файл CSV. Как сообщает нам сообщение об ошибке, Python использует кодек charmap, который не поддерживает символы, содержащиеся в ваших данных. Обычно это происходит, когда вы open файл без указания параметра кодировки на машине Windows.

В прилагаемом кодовом документе (ссылка на комментарий) фрагмент № 10, мы видим, что это так. Вы написали:

with open('wongnai.csv', 'w', newline='') as record:
    fieldnames = ...

В этом случае Python использует кодировку по умолчанию, зависящую от платформы, которая обычно представляет собой 8-битную кодировку на машинах Windows. Укажите кодек, который поддерживает весь Юникод, и запись файла должна завершиться успешно:

with open('wongnai.csv', 'w', newline='', encoding='utf16') as record:
    fieldnames = ...

Конечно, вы также можете использовать utf8 или utf32 вместо utf16. UTF-8 очень популярен для сохранения файлов в средах Unix и в Интернете, но если вы планируете позже открыть файл CSV в Excel, вы можете столкнуться с некоторыми проблемами, связанными с тем, чтобы приложение отображало данные должным образом. Более устойчивое к Windows (но технически нестандартное) решение - использовать "utf-8-sig", который добавляет некоторый полумагический символ в начало файла, чтобы помочь программам Windows понять, что это UTF-8.

Работаетссссссс !!!! Большое спасибо. Я ценю ваше время и усилия. Я не могу вас отблагодарить! : D

Meekao 11.09.2018 09:25

Не стоит беспокоиться. Я рад, что это помогло.

lenz 11.09.2018 09:36

Другие вопросы по теме