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实现博客文章爬虫示例
Feb 26 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
Nov 28 Python
Python之日期与时间处理模块(date和datetime)
Feb 16 Python
教你用一行Python代码实现并行任务(附代码)
Feb 02 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 Python
python redis 批量设置过期key过程解析
Nov 26 Python
python3 pathlib库Path类方法总结
Dec 26 Python
Python读取JSON数据操作实例解析
May 18 Python
python程序需要编译吗
Jun 19 Python
Python同时迭代多个序列的方法
Jul 28 Python
python 爬虫如何正确的使用cookie
Oct 27 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 UTF-8、Unicode和BOM问题
2010/05/18 PHP
PHP防CC攻击实现代码
2011/12/29 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
javascript div 弹出可拖动窗口
2009/02/26 Javascript
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
javascript实现的全国省市县无刷新多级关联菜单效果代码
2016/08/01 Javascript
微信小程序 标签传入数据
2017/05/08 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
2018/03/28 jQuery
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
django使用html模板减少代码代码解析
2017/12/12 Python
python Pandas 读取txt表格的实例
2018/04/29 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
python中return如何写
2020/06/18 Python
Python通过len函数返回对象长度
2020/10/22 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
Hunkemöller西班牙:欧洲最大的内衣连锁店
2018/08/15 全球购物
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
大学生求职简历的自我评价
2013/10/14 职场文书
生产车间主任的个人自我鉴定
2013/10/25 职场文书
高二地理教学反思
2014/01/24 职场文书
优秀语文教师事迹
2014/05/18 职场文书
电气自动化求职信
2014/06/24 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
群众路线教育实践活动对照检查材料思想汇报(副处级领导)
2014/10/04 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
处级干部考察材料
2014/12/24 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers
python 中[0]*2与0*2的区别说明
2021/05/10 Python