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

说明2:字符编码详细参考本篇博客文件操作详细参考本篇博客

编码(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文本文件读写操作时的字符编码问题的更多相关文章

  1. python 文件读写操作(24)

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

  2. 转 Python - openpyxl 读写操作Excel

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. Python—文件读写操作

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

随机推荐

  1. (转)python中join()方法

    原文:http://blog.csdn.net/weixin_40475396/article/details/78227747 函数:string.join() Python中有join()和os. ...

  2. phpStrom安装PHP_CodeSniffer检查代码规范

    为什么使用PHP_CodeSniffer 一个开发团队统一的编码风格,有助于他人对代码的理解和维护,对于大项目来说尤其重要. PHP_CodeSniffer是PEAR中的一个用PHP5写的用来检查嗅探 ...

  3. SWUST OJ Gold Nuggets Distribution(0490)

    Gold Nuggets Distribution(0490) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 421 Accepte ...

  4. jq ajaxPrefilter 防止重复提交ajax

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 树的三种DFS策略(前序、中序、后序)遍历

    之前刷leetcode的时候,知道求排列组合都需要深度优先搜索(DFS), 那么前序.中序.后序遍历是什么鬼,一直傻傻的分不清楚.直到后来才知道,原来它们只是DFS的三种不同策略. N = Node( ...

  6. Javascript学习笔记-基本概念-操作符

    1.一元操作符 (1)递增和递减操作符 只能操作一个值的操作符叫一元操作符. var age = 29; ++age; var age = 29; --age; var age = 29; var a ...

  7. 攻防世界Mobile6 app1 XCTF详解

    XCTF_app1 先安装看看 点击芝麻开门之后会弹出“年轻人不要耍小聪明噢” 这大概就能看懂是点击之后进行判断,那就直接去看JEB,看看判断条件是什么 V1是输入的字符串,V2获取包信息(百度的), ...

  8. 什么是Activiti

    什么是Activiti Activiti属于工作流引擎的一个开源实现.Activiti由Tom Bayen发起.在2010年5月发布了第一个版本.命名也很有意思的采取了Activities(活动)的化 ...

  9. 【30分钟学完】canvas动画|游戏基础(4):边界与碰撞

    前言 本系列前几篇中常出现物体跑到画布外的情况,本篇就是为了解决这个问题. 阅读本篇前请先打好前面的基础. 本人能力有限,欢迎牛人共同讨论,批评指正. 越界检测 假定物体是个圆形,如图其圆心坐标即是物 ...

  10. koa进阶史(二)

    之前想着放弃CAS的验证吧,但是又去请教了一个大牛,了解到sf公司的CAS验证校验的参数不是sessionId而是另外两个,后登陆sit环境偷了两个参数后,后台接口成功返回200.然后node层也就能 ...