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竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
Python3爬虫使用Fidder实现APP爬取示例
Nov 27 Python
对pycharm 修改程序运行所需内存详解
Dec 03 Python
检测python爬虫时是否代理ip伪装成功的方法
Jul 12 Python
Python使用tkinter模块实现推箱子游戏
Oct 08 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
Oct 23 Python
django rest framework使用django-filter用法
Jul 15 Python
Django web自定义通用权限控制实现方法
Nov 24 Python
python分布式爬虫中消息队列知识点详解
Nov 26 Python
python爬取2021猫眼票房字体加密实例
Feb 19 Python
python自动获取微信公众号最新文章的实现代码
Jul 15 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生成静态页面详解
2006/12/05 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
PHP 安全检测代码片段(分享)
2013/07/05 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
一些不错的js函数ajax
2008/08/20 Javascript
jQuery Ajax文件上传(php)
2009/06/16 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
javascript模块化简单解析
2016/04/07 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
python操作MySQL数据库的方法分享
2012/05/29 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
2020/03/28 Python
如何用python写个模板引擎
2021/01/14 Python
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
医学院学生的自我评价分享
2013/11/19 职场文书
全运会口号
2014/06/20 职场文书
个性车贴标语
2014/06/24 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
县委党的群众路线教育实践活动工作情况报告
2014/10/25 职场文书
2014年化验室工作总结
2014/11/21 职场文书
小学英语复习计划
2015/01/19 职场文书