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命令行传递实例化对象的方法
Nov 02 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
Oct 29 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
Python autoescape标签用法解析
Jan 17 Python
对tensorflow 中tile函数的使用详解
Feb 07 Python
python 弧度与角度互转实例
Apr 15 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
Jun 12 Python
如何理解python对象
Jun 21 Python
通俗讲解python 装饰器
Sep 07 Python
python实现文件+参数发送request的实例代码
Jan 05 Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 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调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
javascript 二分法(数组array)
2010/04/24 Javascript
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
js style.display=block显示布局错乱问题的解决方法
2016/09/21 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
2017/01/19 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
JavaScript创建对象方法实例小结
2018/09/03 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python实现socket客户端和服务端简单示例
2014/02/24 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
python列表使用实现名字管理系统
2019/01/30 Python
Python列表对象实现原理详解
2019/07/01 Python
python实现图片中文字分割效果
2019/07/22 Python
python 魔法函数实例及解析
2019/09/25 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
web字体加载方案优化小结
2019/11/29 HTML / CSS
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
CK加拿大官网:Calvin Klein加拿大
2020/03/14 全球购物
Java如何格式化日期
2012/08/07 面试题
骨干教师培训制度
2014/01/13 职场文书
运动会口号8字
2014/06/07 职场文书
物理学专业自荐信
2014/06/11 职场文书
公司授权委托书范文
2014/09/21 职场文书
个人党性分析材料
2014/12/19 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
MySQL学习之基础命令实操总结
2022/03/19 MySQL