Как конвертировать cp1252 в UTF-8 при экспорте CSV-файла с использованием Python - PullRequest
0 голосов
/ 10 сентября 2018

У меня ошибка 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

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

1 Ответ

0 голосов
/ 11 сентября 2018

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

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

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

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

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.

...