【Python 必会技巧】利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题

先举个例子,分别以不指定编码指定编码为 utf-8指定编码为 utf-8-sig 三种方式来做比较,再将写入 csv 文件和 txt 文件来做个对比


一、不指定编码方式,直接存入 csv 文件

import csvwith 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 csvwith open('test.csv', 'w', encoding='utf-8') as fp:writer = csv.writer(fp)writer.writerow(['汉语', '俄语', '韩语', '日语', '英语'])writer.writerow(['爱你', 'люблю тебя', '사랑해요', '愛しています', 'love you'])

在这里插入图片描述


三、指定编码为 utf-8-sig,再存入 csv 文件

当将编码方式换成 utf-8-sig 之后,显示为正常:

import csvwith open('test.csv', 'w', encoding='utf-8-sig') as fp:writer = csv.writer(fp)writer.writerow(['汉语', '俄语', '韩语', '日语', '英语'])writer.writerow(['爱你', 'люблю тебя', '사랑해요', '愛しています', 'love you'])

在这里插入图片描述


四、不指定编码方式,直接存入 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 文件中,内容都是完全正常的:

with 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')

在这里插入图片描述


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 就能避免这个错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】Dynamics CRM 365零基础入门学习(五)权限管理

一:安全角色 Microsoft Dynamics 365中的安全角色是各种实体的特权和访问级别矩阵。 它们根据其功能分组在不同的选项卡下。 这些组包括:核心记录,营销,销售,服务,业务管理,服务管理&#xff0…

【Python 必会技巧】使用 zip() 函数对序列进行压缩和解压操作

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。 利用 * 号操作符,可以将元组解压为列表。 zip…

【转】Dynamics CRM 365零基础入门学习(七)Dynamics 365 DataMigrationUtility tool使用

SDK里有个工具叫DataMigrationUtility,这个工具适合两个CRM系统之间的数据迁移。例如:在项目上线之初会做数据初始化的工作,一般这个工作会在UAT开始前完成,当UAT完成之后再把这部分初始化数据迁移到生产环境。那我费了半天劲把数…

【Python 标准库学习】日期和时间处理库 — datetime

欢迎加入 Python 官方文档翻译团队:https://www.transifex.com/python-doc/ datetime 模块提供了可以通过多种方式操作日期和时间的类。在支持日期时间数学运算的同时,实现的关注点更着重于如何能够更有效地解析其属性用于格式化输出和数据操作。 datet…

【Python 标准库学习】数据科学计算库 — math

欢迎加入 Python 官方文档翻译团队:https://www.transifex.com/python-doc/ math 模块官方文档:https://docs.python.org/3/library/math.html math 模块包含的函数按照用途可分为:数论与表示函数、幂函数与对数函数、三角函数、角度转换、双…

【转】Dynamics 365中的应用程序介绍

本人微信和易信公众号:微软动态CRM专家罗勇 ,回复275或者20180630可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me 。 Dynamics 365引入了应用程序,为啥…

【Python 标准库学习】伪随机数生成库 — random

欢迎加入 Python 官方文档翻译团队:https://www.transifex.com/python-doc/ 随机函数在很多科学计算中都会用到,比如生成一系列随机数来计算平均值、高斯分布、伽马分布、贝塔分布、对数正态分布等。 几乎所有模块函数都依赖于基本函数 random() &#…

【转】Dynamics 365中配置和使用文件夹级别的跟踪(folder-level tracking)

本人微信和易信公众号:微软动态CRM专家罗勇 ,回复274或者20180630可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me 。 Dynamics 365与Office 365可以方便紧密的集成…

【Python 标准库学习】多种操作系统接口和常用路径操作库 — os 与 os.path

欢迎加入 Python 官方文档翻译团队:https://www.transifex.com/python-doc/ os 模块简介:主流操作系统有 Windows、UNIX、Mac OS 等,os 模块为多种操作系统的访问提供了相关功能的支持,涉及对文件相关操作功能的实现、系统访问 Pa…

【转】Dynamics 365Online 如何启用手机端APP的离线功能

隐约记得365自带的手机app是支持离线功能的,但实际尝试后发现不行,断开网络后直接提示下图这样,无法操作了 然后就去查询了下最新版的Online设置离线的方式,步骤还挺多的,本篇即来分享下 第一步,首先要确定…

【Python 标准库学习】系统相关的参数和函数库 — sys

欢迎加入 Python 官方文档翻译团队:https://www.transifex.com/python-doc/ sys 模块提供了与 Python 解释器紧密相关的一些变量和函数,这些变量可能被解释器使用,也可能由解释器提供 sys 模块官方文档:https://docs.python.org/…

【转】Microsoft Teams快速上手系列-01Teams的前世今生

说到Teams,这到底是一个什么产品?有人说它是团队协作工具,有人说它是云视频系统,有人说它是Hub,还有人说它是微软有史以来发展最快的一个产品,还有人说它完全是一个高效办公神器。其实都是对的。 Teams集成…

【Python 标准库学习】时间相关的函数库 — time

欢迎加入 Python 官方文档翻译团队:https://www.transifex.com/python-doc/ time 模块提供了各种时间相关的函数,该模块中的大多数函数是调用了所在平台 C 语言库的同名函数,这些函数的语义因平台而异,可能会在不同的平台有不同的…

【转】响应式详解

一两年以前,我发现,很多人都被响应式搞得很懵逼。 现在,我依然发现,还是有很多人,依旧被响应式搞得很懵逼。 所以,我也很懵逼。 到底是哪个环节出了问题,让这么多学习前端的同学对于这个响应…

【Python 标准库学习】容器数据类型库 — collections

欢迎加入 Python 官方文档翻译团队:https://www.transifex.com/python-doc/ collections 模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。 collections 模块官方文档:https://docs.python.or…

【Python 标准库学习】安全哈希与摘要算法库 — hashlib

欢迎加入 Python 官方文档翻译团队:https://www.transifex.com/python-doc/ hashlib 模块针对不同的安全哈希和消息摘要算法实现了一个通用的接口。提供了常见的摘要算法,如MD5,SHA1等等。 摘要算法又称哈希算法、散列算法,摘要算…

【Python 必会技巧】[i for i in range(1,10)] — 列表解析式,列表中使用 for 循环

经常会看到类似于 [i for i in range(1,10)] 的表达式,这种表达式称为列表解析(List Comprehensions),类似的还有字典解析、集合解析等等。 列表解析式是将一个列表(实际上适用于任何可迭代对象)转换成另一…

【转】Microsoft Teams 常见问题

作者:Zimu 链接:https://www.zhihu.com/question/52246335/answer/244877022 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 功能还是很全的,能和skype、onedrive、yammer、shar…

Python 数据分析三剑客之 NumPy(一):理解 NumPy / 数组基础

CSDN 课程推荐:《Python 数据分析与挖掘》,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

【转】Asp.net的生命周期之应用程序生命周期

参考:http://msdn.microsoft.com/zh-cn/library/ms178473(vvs.100).aspx 参考:http://www.cnblogs.com/JimmyZhang/archive/2007/09/04/880967.html Http请求刚刚到达服务器的时候 当服务器接收到一个 Http请求的时候,IIS (Int…