Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题


Posted in Python onFebruary 21, 2020

先举个例子,分别以不指定编码指定编码为 utf-8指定编码为 utf-8-sig 三种方式来做比较,再将写入 csv 文件和 txt 文件来做个对比

一、不指定编码方式,直接存入 csv 文件

import csv

with open('test.csv', 'w') as fp:
 writer = csv.writer(fp)
 writer.writerow(['汉语', '俄语', '韩语', '日语', '英语'])
 writer.writerow(['爱你', 'люблю тебя', '사랑해요', '?郅筏皮い蓼?, 'love you'])

此时运行程序会报以下错误:

UnicodeEncodeError: 'gbk' codec can't encode character '\uc0ac' in position 14: illegal multibyte sequence

二、指定编码为 utf-8,再存入 csv 文件

接下来尝试将内容以 utf-8 编码方式存入 test.csv 文件中,可以看到除了英文,其他的全都是乱码:

import csv

with open('test.csv', 'w', encoding='utf-8') as fp:
 writer = csv.writer(fp)
 writer.writerow(['汉语', '俄语', '韩语', '日语', '英语'])
 writer.writerow(['爱你', 'люблю тебя', '사랑해요', '?郅筏皮い蓼?, 'love you'])

Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题

三、指定编码为 utf-8-sig,再存入 csv 文件

当将编码方式换成 utf-8-sig 之后,显示为正常:

import csv

with open('test.csv', 'w', encoding='utf-8-sig') as fp:
 writer = csv.writer(fp)
 writer.writerow(['汉语', '俄语', '韩语', '日语', '英语'])
 writer.writerow(['爱你', 'люблю тебя', '사랑해요', '?郅筏皮い蓼?, 'love you'])

Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题

四、不指定编码方式,直接存入 txt 文件

with open('test.txt','w') as fp:
 fp.write('爱你, люблю тебя, 사랑해요, ?郅筏皮い蓼? love you')

和存入 csv 文件一样,也会报以下错误:

UnicodeEncodeError: 'gbk' codec can't encode character '\uc0ac' in position 16: illegal multibyte sequence

五、指定编码为 utf-8 / utf-8-sig,再存入 txt 文件

utf-8 或者 utf-8-sig 编码方式存入 test.txt 文件中,内容都是完全正常的:

ith open('test.txt','w', encoding='utf-8') as fp:
  fp.write('爱你, люблю тебя, 사랑해요, ?郅筏皮い蓼? love you')

with open('test.txt','w', encoding='utf-8-sig') as fp:
  fp.write('爱你, люблю тебя, 사랑해요, ?郅筏皮い蓼? love you')

Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题

utf-8 与 utf-8-sig 有什么区别?

  • utf-8 以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,也因此它实际上并不需要 BOM;
  • uft-8-sig 中 sig 全拼为 signature,即带有签名的 utf-8(UTF-8 with BOM);
  • BOM 全称 ByteOrder Mark,字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码。

为什么写入 csv 文件要用 utf-8-sig 编码?

  • Excel 在读取 csv 文件的时候是通过读取文件头上的 BOM 来识别编码的,如果文件头无 BOM 信息,则默认按照 Unicode 编码读取。
  • 当我们使用 utf-8 编码来生成 csv 文件的时候,并没有生成 BOM 信息,Excel 就会自动按照 Unicode 编码读取,就会出现乱码问题了。

为什么写入 txt 文件要用 utf-8 编码?

在写入 txt 文件时,Windows 会默认转码成 gbk,遇到某些 gbk 不支持的字符就会报错,在打开文件时就声明编码方式为 utf-8 就能避免这个错误。

知识点扩展:

utf-8和utf-8-sig的区别

前言:在写入csv文件中,出现了乱码的问题。

解决:utf-8 改为utf-8-sig

区别如下:

1、”utf-8“ 是以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,因此它不需要BOM,所以当用"utf-8"编码方式读取带有BOM的文件时,它会把BOM当做是文件内容来处理, 也就会发生类似上边的错误.

2、“uft-8-sig"中sig全拼为 signature 也就是"带有签名的utf-8”, 因此"utf-8-sig"读取带有BOM的"utf-8文件时"会把BOM单独处理,与文本内容隔离开,也是我们期望的结果.

总结

以上所述是小编给大家介绍的Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题,希望对大家有所帮助,也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python执行时间的计算方法小结
Mar 17 Python
Python上下文管理器和with块详解
Sep 09 Python
python re模块的高级用法详解
Jun 06 Python
flask框架实现连接sqlite3数据库的方法分析
Jul 16 Python
python绘制多个曲线的折线图
Mar 23 Python
对Python 3.2 迭代器的next函数实例讲解
Oct 18 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
May 13 Python
python实现弹跳小球
May 13 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 Python
浅谈Python中的继承
Jun 19 Python
python绘制汉诺塔
Mar 01 Python
python读写文件write和flush的实现方式
Feb 21 #Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 #Python
浅谈python中频繁的print到底能浪费多长时间
Feb 21 #Python
python使用Geany编辑器配置方法
Feb 21 #Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 #Python
解决Python logging模块无法正常输出日志的问题
Feb 21 #Python
Pycharm和Idea支持的vim插件的方法
Feb 21 #Python
You might like
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
2013/03/17 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
关于jQuery中的each方法(jQuery到底干了什么)
2014/03/05 Javascript
js实现touch移动触屏滑动事件
2015/04/17 Javascript
如何实现移动端浏览器不显示 pc 端的广告
2015/10/15 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
Vue 嵌套路由使用总结(推荐)
2020/01/13 Javascript
JS Array.from()将伪数组转换成数组的方法示例
2020/03/23 Javascript
[26:40]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第一局
2016/02/25 DOTA
约瑟夫问题的Python和C++求解方法
2015/08/20 Python
遗传算法之Python实现代码
2017/10/10 Python
Python3计算三角形的面积代码
2017/12/18 Python
python 多进程队列数据处理详解
2019/12/23 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
解决pytorch 保存模型遇到的问题
2021/03/03 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
美国定制钻石订婚戒指:Ritani
2017/12/08 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
介绍一下grep命令的使用
2012/06/28 面试题
日期和时间问题
2015/01/04 面试题
市场部管理制度
2014/02/02 职场文书
优秀老师事迹材料
2014/02/05 职场文书
学习计划书怎么写
2014/09/15 职场文书
见习报告的格式
2014/11/04 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
python turtle绘图命令及案例
2021/11/23 Python