python可以处理任何字符编码文本对不对,Python文本文件读写操作时的字符编码问题...

说明1:文本文件的字符编码问题只存在t模式中,如:open('a.txt', mode='rt')

编码(encode):

我们输入的任何字符想要以文件(如.txt)的形式保存在计算机的硬盘上, 必须先按照一定的规则编成计算机认识的二进制后,才能存在电脑硬盘上。这种规则有GBK,utf-8等。

解码(decode):

同理,计算机硬盘上文件,想要正确显示在电脑屏幕上,也必须先按照一定的规则从计算机硬盘上通过解码,把二进制数据解码成字符,我们才能在电脑屏幕上看到。并且,如果,解码的方式不对,就会出现乱码。如,文件是以GBK的形式编码的,那解码也必须使用GBK解码,如果使用UTF-8解码,则会出现乱码。

文件的读

Python中通过open()的方式,对文本文件作读和写的操作

现在,我有两个文件:

test1_gbk.txt

test2_utf-8.txt

两者的相同点是:保存的内容相同(“中国你好”)

两者的不同点是:test1_gbk.txt按gbk编码保存在硬盘上,test2_utf-8按utf-8编码保存在硬盘上

现在做个测试

测试环境:

win10

Python3.7

Pycharm

1,读test1_gbk.txt

f = open('test1_gbk.txt', 'r')

s = f.read()

f.close()

print(s)

结果:你好中国

2,读test2_utf-8.txt

f = open('test2_utf-8.txt', 'r')

s = f.read()

f.close()

print(s)

结果报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xbd in position 14: incomplete multibyte sequence

补充:如果文件中写的不是“你好中国”,而是其他的中文字符,可能不会报错但会出现乱码的现象。

为什么?

我们通过查看open() 的函数的解释可以发现 open() 是有很多默认参数的,如,encoding

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

......

#encoding解释如下:

encoding is the name of the encoding used to decode or encode the

file. This should only be used in text mode. The default encoding is

platform dependent, but any encoding supported by Python can be

passed. See the codecs module for the list of supported encodings.

就是说,encoding其实具有编码和解码的两个功能。

我的理解是:

当open用来读取文件时,encoding的作用是解码;

当open用来写文件时,encoding的作用是编码。

另外,解码或编码时,encodng的默认方式到底是gbk还是UTF-8,这个取决于我们的操作系统,在windows上是默认的gbk。

因此,上面的第二个测试结果,出现报错的提示,想要不报错,只要添加 encoding = 'utf-8'即可

f = open('test2_utf-8.txt', 'r', encoding = 'utf-8')

s = f.read()

f.close()

print(s)

另外知道这点以后,对于test1_gbk.txt 来说,encoding = ‘gbk’ 存在与否是没有影响的

文件的写

以上是文件的读,文件的写同理

不同的是此时,encoding的功能是编码

通过下面的代码创建的文件test3.txt是通过GBK的方式编码保存的文件

f = open('test3.txt', 'w')

s = '中国你好'

f.write(s)

f.close()

如果想要给你的朋友发送一个.txt文件,但是他的笔记本是苹果的mac,你发的文件必须是ufd-8编码的文本文件,否则对方打开是就会出现乱码,因为mac默认的解码是按 utf-8

如果,你的笔记本也是mac,那没有关系,因为mac默认的写的文本文件的编码是utf-8

但如果你是windows用户,你就必须注意。

f = open('test4.txt', 'w', encoding = 'utf-8')

s = '中国你好'

f.write(s)

f.close()

在windows上,上面这种方式就创建了一个以utf-8编码的文件 test4.txt

python 文件读写操作(24)

以前的代码都是直接将数据输出到控制台,实际上我们也可以通过读/写文件的方式读取/输出到磁盘文件中,文件读写简称I/O操作.文件I/O操作一共分为四部分:打开(open)/读取(read)/写入(wri ...

转 Python - openpyxl 读写操作Excel

Python - openpyxl 读写操作Excel   openpyxl特点   openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间 ...

malloc分配到一块内存,读写操作时却发生segmentation falt的奇怪问题。

期初现象:malloc一块内存,读写操作时发生segmentation falt.一般来讲malloc倘若失败应该抛出异常,所以malloc返回一个指针后,这个指针应该都是可用的,况且是进行读操作. ...

如何减小SRAM读写操作时的串扰

静态存储器SRAM是一款不需要刷新电路即能保存它内部存储数据的存储器.在SRAM 存储阵列的设计中,经常会出现串扰问题发生.那么要如何减小如何减小SRAM读写操作时的串扰,以及提高SRAM的可靠性呢, ...

Python中文本文件读写操作的编码问题

Python中文本文件读写的编码问题 编码(encode): 我们输入的任何字符想要以文件(如.txt)的形式保存在计算机的硬盘上, 必须先经按照一定的规则编成计算机认识的二进制后,才能存在电脑硬盘上 ...

python开发基础之数据类型、字符编码、文件操作

一.知识点 1.身份运算: 2.现在计算机系统通用的字符编码工作方式:在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码.用记事本编辑的时候,从文件 ...

Java精选笔记_IO流(转换流、常用流、流操作规律、字符编码)

IO流 用来处理设备之间的数据传输,java对数据的操作是通过流的方式,java用于操作流的对象都在IO包中 按操作数据分为:字节流和字符流:按流向分为:输入流和输出流. 程序从输入流中读取数据,向输 ...

Python基础(5)_字符编码、文件处理

一.文件读取过程: 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的,断电后数 ...

Python—文件读写操作

初识文件操作 使用open()函数打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了,根据打开文件的方式不同能够执行的操作也会有相应的差异. 打开文件的方式: r, w, a, ...

随机推荐

Linux网络编程入门 (转载)

(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

WebLogic集群案例分析

WebLogic集群案例分析 2012年8月,某证券交易系统(采用Weblogic中间件),由于基金业务火爆,使系统压力太大,后台服务器频繁死机时,这时工程师们紧急调试系统及恢复操作,等完成这些操作花 ...

Android学习过程中遇到的问题

1.使用在Activity布局之上重叠显示操作栏,第一次使用出现错误信息. 错误信息如下:java.lang.RuntimeException:Ubable to start activity Com ...

format——MATLAB

format:设置输出格式 对浮点性变量,缺省为format short. format并不影响matlab如何计算和存储变量的值.对浮点型变量的计算,即单精度或双精度,按合适的浮点精度进行,而不论变 ...

Date、String、Calendar、Timestamp类型之间的转化

1.Calendar 转化 String Calendar calendat = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDa ...

ceph伦理概念

Preface: CEPH: THE FUTURE OF STORAGE(未来存储) Ceph was made possible by a global community of passionat ...

运用Unity实现AOP拦截器

运用Unity实现AOP拦截器[结合异常记录实例] 本篇文章将通过Unity实现Aop异常记录功能:有关Unity依赖注入可以看前两篇文章: 1:运用Unity实现依赖注入[结合简单三层实例] 2:运 ...

MySQL 5.7忘记root密码如何修改?

一直以来,MySQL的应用和学习环境都是MySQL 5.6和之前的版本,也没有去关注新版本MySQL 5.7的变化和新特性.今天帮人处理忘记root密码的时时候,发现以前的方法不奏效了.具体情况如下所 ...

使用Hadoop API 压缩HDFS文件

下篇解压缩:使用Hadoop API 解压缩 HDFS文件 起因: 集群磁盘剩余空间不足. 删除了存储在HDFS上的,一定时间之前的中间结果,发现并不能释放太多空间,查看计算业务,发现,每天的日志存在 ...

c++11特性与cocos2d-x 3.0之std::bind与std::function

昨天同事让帮忙写一小功能,才发现cocos2d-x 3.0 和 cocos2d-x 3.0rc0 差别还是相当大的. 发现Label这一个控件,3.0就比rc0版本多了一个创建函数,更为关键的是3.0 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值