如何解决Python3写入CSV出现 gbk codec cannot encode的错误?

今天,我在 Windows 上用 Python3 爬取知乎上有关中医的问答,但是在把爬取的内容写进CSV文件的时候,出现了以下异常。

UnicodeEncodeError: 'gbk' codec can't encode character '\u2630' in position 3969: illegal multibyte sequence

经过上网查找,发现问题的原因在于 Python3 对字符串的默认编码是Unicode,而爬取的内容,正是储存在字符串变量里。

而使用代码创建CSV时,Windows下面新建的文本文件(CSV是一种文本文件)默认的编码是gbk(Windows简体中文版的系统默认编码就是gbk)。

import requests
import json
import time
import csv

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36',
}

i = 0
csvfile = open('csv_test.csv', 'w', newline='')
writer = csv.writer(csvfile)
writer.writerow(['id', 'created_time', 'author', 'content'])

while True:
    url = '' # 网址
    res = requests.get(url, headers=headers)
    res.encoding = 'utf-8'
    jsonfile = json.loads(res.text)
    is_end = jsonfile['paging']['is_end']

for data in jsonfile['data']:
        l = list()
        l.append(data['id'])
        time_local = time.localtime(data['created_time'])
        l.append(time.strftime("%Y-%m-%d %H:%M:%S", time_local))
        l.append(data['author']['name'])
        l.append(data['content'])
        writer.writerow(l)

print('打印到第{0}页'.format(int(i / 5)))
    i += 5

if is_end == True:
        csvfile.close()
        break
    time.sleep(1)

当把从网页上读取的内容写到CSV文件的时候,意味着把一个Unicode的字符序列写入到一个编码是gbk的文件。

故报错,解决方法就是在打开该文件的时候,指定文件的编码,让它以指定的编码打开,如下所示。

csvfile = open('csv_test.csv', 'w', newline='', encoding='utf-8')

这样就解决了以上写入错误的问题,但我们用Excel打开该文件时,发现出现了中文乱码的问题,如下图所示。

CSV文件乱码问题一般是编码方式的问题,Excel默认的编码格式是ASNI,故选择以记事本的打开方式打开CSV文件,另存时编码方式选择“ASNI”或“utf-8”即可。

把自己解决问题的过程记录一下,为后面大家遇到这类问题做一个参考。


(0)

相关推荐