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的Bottle框架中使用微信API的示例
Apr 23 Python
python开发中module模块用法实例分析
Nov 12 Python
菜鸟使用python实现正则检测密码合法性
Jan 05 Python
Python开发之快速搭建自动回复微信公众号功能
Apr 22 Python
Windows下Anaconda的安装和简单使用方法
Jan 04 Python
Python解析命令行读取参数--argparse模块使用方法
Jan 23 Python
python实现合并两个排序的链表
Mar 03 Python
Python实现二叉树的常见遍历操作总结【7种方法】
Mar 06 Python
Python实现基于SVM的分类器的方法
Jul 19 Python
Keras loss函数剖析
Jul 06 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
如何在 Matplotlib 中更改绘图背景的实现
Nov 26 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
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
javascript web页面刷新的方法收集
2009/07/02 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
2018/02/16 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
JavaScript动态检测密码强度原理及实现方法详解
2019/06/11 Javascript
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
原生js实现购物车
2020/09/23 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
python利用requests库进行接口测试的方法详解
2018/07/06 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
2019/08/20 Python
JD Sports芬兰:英国领先的运动鞋和运动服饰零售商
2018/11/16 全球购物
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
怎么写好自荐信
2013/10/30 职场文书
一名毕业生的自我鉴定
2013/12/04 职场文书
给幼儿园老师的表扬信
2014/01/19 职场文书
乌鸦喝水教学反思
2014/02/07 职场文书
数控技术学生的自我评价
2014/02/15 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
答谢酒会主持词
2015/07/02 职场文书
2015年度对口支援工作总结
2015/07/22 职场文书
奖学金申请个人主要事迹材料
2015/11/04 职场文书
详解CSS伪元素的妙用单标签之美
2021/05/25 HTML / CSS