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合并多个装饰器小技巧
Apr 28 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
Python使用正则表达式实现文本替换的方法
Apr 18 Python
wxPython之解决闪烁的问题
Jan 15 Python
python模拟登陆,用session维持回话的实例
Dec 27 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
Nov 20 Python
Python解析json代码实例解析
Nov 25 Python
用Python 爬取猫眼电影数据分析《无名之辈》
Jul 24 Python
pycharm 如何取消连按两下shift出现的全局搜索
Jan 15 Python
python如何发送带有附件、正文为HTML的邮件
Feb 27 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 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邮件类
2007/01/03 PHP
php代码运行时间查看类代码分享
2011/08/06 PHP
PHP图片处理之图片旋转和图片翻转实例
2014/11/19 PHP
PHP中static关键字以及与self关键字的区别
2015/07/01 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
jquery eval解析JSON中的注意点介绍
2013/08/23 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
基于jquery实现等比缩放图片
2014/12/03 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
2016/03/08 Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
2016/07/09 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
在vue中使用jsx语法的使用方法
2019/09/30 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
详解python3中socket套接字的编码问题解决
2017/07/01 Python
Python输出带颜色的字符串实例
2017/10/10 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
对pandas里的loc并列条件索引的实例讲解
2018/11/15 Python
python的sorted用法详解
2019/06/25 Python
对python 调用类属性的方法详解
2019/07/02 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
2013届毕业生求职信范文
2013/11/20 职场文书
写给老师的表扬信
2014/01/21 职场文书
建筑施工安全责任书
2014/07/24 职场文书
银行竞聘报告范文
2014/11/06 职场文书
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏