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实现在线程里运行scrapy的方法
Apr 07 Python
python3音乐播放器简单实现代码
Apr 20 Python
Python的语言类型(详解)
Jun 24 Python
python快速建立超简单的web服务器的实现方法
Feb 17 Python
python 实现对文件夹内的文件排序编号
Apr 12 Python
解决python3 json数据包含中文的读写问题
May 10 Python
用python生成与调用cntk模型代码演示方法
Aug 26 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
用Python实现校园通知更新提醒功能
Nov 23 Python
django rest framework 过滤时间操作
Jul 12 Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 Python
如何查看python关键字
Jan 17 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
openflashchart 2.0 简单案例php版
2012/05/21 PHP
PHP生成压缩文件实例
2015/02/07 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
thinkphp分页集成实例
2017/07/24 PHP
TP5框架请求响应参数实例分析
2019/10/17 PHP
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
玩转python爬虫之cookie使用方法
2016/02/17 Python
深入理解python try异常处理机制
2016/06/01 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
python实现ip代理池功能示例
2019/07/05 Python
Python求离散序列导数的示例
2019/07/10 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
python关于变量名的基础知识点
2020/03/03 Python
Python callable内置函数原理解析
2020/03/05 Python
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
高二历史教学反思
2014/01/25 职场文书
《生命的药方》教学反思
2014/04/08 职场文书
中文专业毕业生自荐信
2014/05/24 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
幸福家庭事迹材料
2014/12/20 职场文书
酒店员工辞职信范文
2015/02/28 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书