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 实现简单的电话本功能
Aug 09 Python
详解Python 数据库 (sqlite3)应用
Dec 07 Python
Python中进程和线程的区别详解
Oct 29 Python
python批量从es取数据的方法(文档数超过10000)
Dec 27 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
对python文件读写的缓冲行为详解
Feb 13 Python
详解Python做一个名片管理系统
Mar 14 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
Dec 20 Python
python递归调用中的坑:打印有值, 返回却None
Mar 16 Python
关于Python错误重试方法总结
Jan 03 Python
opencv用VS2013调试时用Image Watch插件查看图片
Jul 26 Python
Python 如何利用ffmpeg 处理视频素材
Nov 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生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
laravel7学习之无限级分类的最新实现方法
2020/09/30 PHP
jquery $.ajax入门应用二
2008/11/19 Javascript
Jquery 设置标题的自动翻转
2009/10/03 Javascript
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
Vue实现简易计算器
2020/02/25 Javascript
Javascript组合继承方法代码实例解析
2020/04/02 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
Python入门学习之字符串与比较运算符
2015/10/12 Python
python下载图片实现方法(超简单)
2017/07/21 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
基于Python的PIL库学习详解
2019/05/10 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
PyQt5实现简单的计算器
2020/05/30 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
北美大型运动类产品商城:Champs Sports
2017/01/12 全球购物
李宁官方网店:中国运动品牌
2017/11/02 全球购物
英语专业个人求职自荐信
2013/09/21 职场文书
企业演讲稿范文
2013/12/28 职场文书
适用于所有创业者的创业计划书
2014/02/05 职场文书
校园安全教育广播稿
2014/02/17 职场文书
环保专项行动方案
2014/05/12 职场文书
学习普通话的体会
2014/11/07 职场文书
社区工作者个人总结
2015/02/28 职场文书
2016情人节宣传语
2015/07/14 职场文书
python基于tkinter实现gif录屏功能
2021/05/19 Python