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 提取文件的小程序
Jul 29 Python
Python构造函数及解构函数介绍
Feb 26 Python
Linux中Python 环境软件包安装步骤
Mar 31 Python
Python利用Beautiful Soup模块修改内容方法示例
Mar 27 Python
Python检测网络延迟的代码
May 15 Python
python验证码识别教程之利用投影法、连通域法分割图片
Jun 04 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 Python
详解python 降级到3.6终极解决方案
Feb 06 Python
Python中pyecharts安装及安装失败的解决方法
Feb 18 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
详解python datetime模块
Aug 17 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
简单的页面缓冲技术
2006/10/09 PHP
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
javascript里的条件判断
2007/02/27 Javascript
GreyBox技术总结(转)
2010/11/23 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
JavaScript多线程详解
2015/08/12 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
python的命名规则知识点总结
2019/10/04 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
Django中FilePathField字段的用法
2020/05/21 Python
keras中的History对象用法
2020/06/19 Python
jupyter 添加不同内核的操作
2021/02/06 Python
检测用户浏览器是否支持CSS3的方法
2009/08/29 HTML / CSS
CSS3 边框效果
2019/11/04 HTML / CSS
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
学校卫生检查制度
2014/02/03 职场文书
人力资源部经理岗位职责规定
2014/02/23 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
婚礼答谢词
2015/01/04 职场文书
2015年数学教研工作总结
2015/07/22 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
Windows10下安装MySQL8
2021/04/06 MySQL
Python基础之pandas数据合并
2021/04/27 Python
python中if和elif的区别介绍
2021/11/07 Python
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL