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中使用HTML模版的教程
Apr 29 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
May 17 Python
浅谈python中copy和deepcopy中的区别
Oct 23 Python
详解flask表单提交的两种方式
Jul 21 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
Apr 05 Python
Python变量访问权限控制详解
Jun 29 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
Nov 05 Python
Django 请求Request的具体使用方法
Nov 11 Python
使用python实现哈希表、字典、集合操作
Dec 22 Python
Python greenlet和gevent使用代码示例解析
Apr 01 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
May 08 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
一个查看session内容的函数
2006/10/09 PHP
关于php mvc开发模式的感想
2011/06/28 PHP
php数据访问之增删改查操作
2016/05/09 PHP
php自定义函数实现统计中文字符串长度的方法小结
2017/04/15 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
Js 随机数产生6位数字
2010/05/13 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
jQuery中size()方法用法实例
2014/12/27 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
Vue Cli3 打包配置并自动忽略console.log语句的方法
2020/04/23 Javascript
详解Python发送邮件实例
2016/01/10 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
简单了解python单例模式的几种写法
2019/07/01 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
利用python对mysql表做全局模糊搜索并分页实例
2020/07/12 Python
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
实体的生命周期
2013/08/31 面试题
绿色学校实施方案
2014/03/31 职场文书
销售人员求职信
2014/07/22 职场文书
党员群众路线教育实践活动剖析材料
2014/10/10 职场文书
高校自主招生校长推荐信
2015/03/23 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
Javascript中async与await的捕捉错误详解
2022/03/03 Javascript
nginx日志格式分析和修改
2022/04/28 Servers