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 04 Python
Python 3中print函数的使用方法总结
Aug 08 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
python分析作业提交情况
Nov 22 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
python实现词法分析器
Jan 31 Python
python实现电子产品商店
Feb 26 Python
Python基于opencv实现的简单画板功能示例
Mar 04 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 Python
Python 中数组和数字相乘时的注意事项说明
May 10 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和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
2011/07/03 PHP
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
强烈声明: 不要使用(include/require)_once
2013/06/06 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
PHP的password_hash()使用实例
2014/03/17 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
2015/08/04 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
在Python中使用itertools模块中的组合函数的教程
2015/04/13 Python
Python制作词云的方法
2018/01/03 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
详解python中eval函数的作用
2019/10/22 Python
python简单的三元一次方程求解实例
2020/04/02 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
数控技术与应用毕业生自荐信
2013/09/24 职场文书
行政助理求职自荐信
2013/10/26 职场文书
西安交大自主招生自荐信
2014/01/27 职场文书
工厂车间标语
2014/06/19 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
领导班子整改方案
2014/10/25 职场文书
先进班集体事迹材料
2014/12/25 职场文书
5.12护士节活动总结
2015/02/10 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
golang语言指针操作
2022/04/14 Golang