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编写一个模仿CPU工作的程序
Apr 16 Python
python 删除大文件中的某一行(最有效率的方法)
Aug 19 Python
python抓取网站的图片并下载到本地的方法
May 22 Python
基于windows下pip安装python模块时报错总结
Jun 12 Python
Python实现注册、登录小程序功能
Sep 21 Python
Python中logging.NullHandler 的使用教程
Nov 29 Python
python学习开发mock接口
Apr 28 Python
python multiprocessing多进程变量共享与加锁的实现
Oct 02 Python
python3实现单目标粒子群算法
Nov 14 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
python是怎么被发明的
Jun 15 Python
python pymysql库的常用操作
Oct 16 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数据库操作方法(MYSQL版)
2011/06/08 PHP
ThinkPHP3.1新特性之字段合法性检测详解
2014/06/19 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
PHP实现登录注册之BootStrap表单功能
2017/09/03 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
简单三步,搞掂内存泄漏
2007/03/10 Javascript
延时重复执行函数 lLoopRun.js
2007/05/08 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
node通过express搭建自己的服务器
2017/09/30 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
js实现移动端吸顶效果
2020/01/08 Javascript
vue实现虚拟列表功能的代码
2020/07/28 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
简单的Python的curses库使用教程
2015/04/11 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
2016/06/28 Python
python 异或加密字符串的实例
2018/10/14 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
关于Python解包知识点总结
2020/05/05 Python
Python如何使用正则表达式爬取京东商品信息
2020/06/01 Python
python二维图制作的实例代码
2020/12/03 Python
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
全国道德模范事迹
2014/02/01 职场文书
《火烧云》教学反思
2014/04/12 职场文书
党章培训心得体会
2014/09/04 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书
Python - 10行代码集2000张美女图
2021/05/23 Python