如何解决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”即可。
把自己解决问题的过程记录一下,为后面大家遇到这类问题做一个参考。