Python中文本文件读写操作的编码问题
Python中文本文件读写的编码问题
编码(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中文本文件读写操作的编码问题的更多相关文章
- 【转】Python中的字符串与字符编码
[转]Python中的字符串与字符编码 本节内容: 前言 相关概念 Python中的默认编码 Python2与Python3中对字符串的支持 字符编码转换 一.前言 Python中的字符编码是个老生常 ...
- Python中的json操作
Python中的json操作 标签(空格分隔): python 编码 json 字符串前缀问题 字符串前缀可以有r,u r:表示原始(raw)字符串,比如'\n'不会被转义.常用于正则. u:表示un ...
- 一句python,一句R︱python中的字符串操作、中文乱码、NaN情况
一句python,一句R︱python中的字符串操作.中文乱码.NaN情况 先学了R,最近刚刚上手Python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句pytho ...
- (Python基础教程之八)Python中的list操作
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
- Delphi中文本文件的操作
Delphi中文本文件的操作 相关知识内容: 在对文本文件进行任何处理之前,首先要打开此文本文件.声明变量:通过此变量可以来引用一个文本文件. 打开一个文件需要两步:首先是 AssignFile(), ...
- python中的赋值操作和复制操作
之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...
- python中的赋值操作
参考:https://www.cnblogs.com/andywenzhi/p/7453374.html?tdsourcetag=s_pcqq_aiomsg(写的蛮好) python中的赋值操作“=” ...
- python中的日志操作和发送邮件
1.python中的日志操作 安装log模块:pip install nnlog 参数:my_log = nnlog.Logger('server_log.log',level='debug',bac ...
- python中OS模块操作文件和目录
在python中执行和操作目录和文件的操作是通过内置的python OS模块封装的函数实现的. 首先导入模块,并查看操作系统的类型: >>> import os os.name # ...
随机推荐
- 移动端数据爬取和Scrapy框架
移动端数据爬取 注:抓包工具:青花瓷 1.配置fiddler 2.移动端安装fiddler证书 3.配置手机的网络 - 给手机设置一个代理IP:port a. Fiddler设置 打开Fiddler软 ...
- Centos7离线安装mysql8
linux版本:Centois7 mysql版本:5.7 一.安装 1.下载mysql离线安装包 下载地址:https://dev.mysql.com/downloads/mysql/ 选择如下: [ ...
- 推荐一个Redis管理工具
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.它支持字符串.哈希表.列表.集合.有序集合,位图,hyperloglogs等数据类型.内置复制.Lu ...
- 第三章: Expressions and Flow Control
第三章: Expressions and Flow Control一:局部变量和实例变量定义变量是指设定变量的数据类型和变量的名字,Java语言要求变量遵循先定义,再初始化,然后使用的规则.作用域:指 ...
- apache出现forbidden
<Directory /> Options FollowSymLinks AllowOverride All Order deny,allow allow from all Require ...
- Logback详细整理,基于springboot的日志配置
Logback的配置介绍: 1.Logger.appender及layout Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型.级别. ...
- 并发容器之阻塞队列DelayQueue的使用案例及源码分析
原文连接:(http://www.studyshare.cn/blog-front//blog/details/1167/0 ) 一.队列及阻塞队列概念 1.队列:是一种特殊线性表,特殊之处在于操作是 ...
- Python基础-使用range创建数字列表以及简单的统计计算和列表解析
1.使用函数 range() numbers = list(range[1,6]) print (numbers) 结果: [1,2,3,4,5] 使用range函数,还可以指定步长,例如,打印1~1 ...
- BZOJ 2460:元素(贪心+线性基)
题目链接 题意 中文题意 思路 线性基学习 题目要求选价值最大的并且这些数异或后不为0,可以考虑线性基的性质:线性基的任意一个非空集合XOR之和不会为0.那么就可以贪心地对价值从大到小排序,加入线性基 ...
- 【POJ - 2718】Smallest Difference(搜索 )
-->Smallest Difference 直接写中文了 Descriptions: 给定若干位十进制数,你可以通过选择一个非空子集并以某种顺序构建一个数.剩余元素可以用相同规则构建第二个数. ...