如何解决Python3写入CSV出现‘gbk‘ codec can‘t encode的错误

news/2024/7/5 2:13:23

今天,我在 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 csvheaders = {'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 += 5if is_end == True:csvfile.close()breaktime.sleep(1)

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

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

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

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

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

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



http://lihuaxi.xjx100.cn/news/253419.html

相关文章

SSIS中的记录集目标

这一篇,我们来看看另外一个特殊的目标组件:记录集目标。它与DataReader目标有些类似,也是在内存中的。但与DataReader目标不同的是,它可以被下游任务使用。 它的使用也比较简单,我们一般指定一个变量来接收它的结果&am…

Java中的锁原理、锁优化、CAS、AQS,看这篇就对了!

点击关注公众号,Java干货及时送达👇01 为什么要用锁?锁-是为了解决并发操作引起的脏读、数据不一致的问题。02 锁实现的基本原理2.1、volatile Java编程语言允许线程访问共享变量, 为了确保共享变量能被准确和一致地更新&#xff…

JNDI概述(转载)

JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有真正掌握J2EE特别是EJB的知识。那么,JNDI…

Oracle Goldengate Windows平台Oracle-Oracle单向复制

实验目的 Goldengate最基本的从源端一对一的单向复制,注意其中Goldengate版本取决于Oracle的版本。单向复制一般适用于保持目标数据库的实时更新,且目标数据库用来检索,如报表或者分析使用。 Source DB 操作系统:Windows 10 64 Or…

用 Python 制作可视化 GUI 界面,一键实现证件照背景颜色的替换

作者 | 欣一来源 | Python爱好者集中营今天,我们来分享一下如何通过Python的十来行代码来替换证件照的背景颜色,那么在最后,小编也会将上述的流程制作成一个GUI界面来方便大家使用。关于界面的大致模样其实和先前的相差不大,大家应…

c++

c中关于STL的学习大家有什么建议和想法。转载于:https://blog.51cto.com/2948144/673496

【组队学习】【24期】集成学习(中)

集成学习(中) 开源内容: https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning 基本信息 贡献人员:李祖贤、薛传雨、赵可、杨毅远、陈琰钰、李嘉骐学习周期:12天学习形式&a…

WatchStor观察:思科携EMC等合作伙伴 圈地数据中心市场

早在今年3月,思科在加利福尼亚州圣何塞市展会中展示了“统一计算系统”(Unified Computing System)之后,我们就明白,数据中心市场将会发生巨大改变,传统的以IBM、惠普、戴尔和Sun为主导的服务器电脑市场,将受到以思科为…