首页 / 知识
python文件读写与字符编码
2023-11-12 13:36:00
PyCharm等IDE开发工具指定的项目工程和文件的字符编码:它的主要作用是告诉Pycharm等IDE开发工具保存文件时应该将字符转换为怎样的字节表示形式,以及打开并展示文件内容时应该以什么字符编码将字节码转换为人类可识别的字符。
Python源代码文件头部指定的字符编码,如*-*coding:utf-8-*-:它的主要作用是告诉Python解释器当前python代码文件保存时所使用的字符编码,Python解释器在执行代码之前,需要先从磁盘读取该代码文件中的字节然后通过这里指定的字符编码将其解码为unicode字符。Python解释器执行Python代码的过程与IDE开发工具是没有什么关联性的。
那么这里为什么又要谈起字符编码的问题呢?
或者换个问法,既然从上面已经指定了字符编码,为什么对文件进行读写时还要指定字符编码呢?从前面的描述可以看出:上面两个地方指定的是Python代码文件的字符编码,是给Python解释器和Pycharm等程序软件用的;而被读写文件的字符编码与Python代码文件的字符编码没有必然联系,读写文件时指定的字符编码是给我们写的程序软件用的。这是不同的主体和过程,希望我说明白了。
读写文件时怎样指定字符编码呢?
上面解释了读写文件为什么要指定字符编码,这里要说下怎样指定字符编码(其实这里主要讨论是读取外部数据时的情形)。这个问题其实在上面的文件读取示例中已经使用过了,这里我们再详细的说一下。
首先,再次看一下Python2和Python3中open函数的定义:
#Python2
open(name[,mode[,buffering]])
#Python3
open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)
可以看到,Python3的open函数中多了几个参数,其中包括一个encoding参数。是的,这个encoding就是用来指定被操作文件的字符编码的。
#读操作
withopen('song.txt','r',encoding='utf-8')asf:
print(f.read())
#写操作
withopen('song.txt','w',encoding='utf-8')asf:
print(f.write('你好'))
那么Python2中怎样指定呢?Python2中的对文件的read和write操作都是字节,也就说Python2中文件的read相关方法读取的是字节串(如果包含中文字符,会发现len()方法的结果不等于读取到的字符个数,而是字节数)。如果我们要得到正确的字符串,需要手动将读取到的结果decode(解码)为字符串;相反,要以特定的字符编码保存要写入的数据时,需要手动encode(编码)为字节串。这个encode()和decode()函数可以接收一个字符编码参数。Python3中read和write操作的都是字符串,实际上是Python解释器帮我们自动完成了写入时的encode(编码)和读取时的decode(解码)操作,因此我们只需要在打开文件(open函数)时指定字符编码就可以了。
#读操作
withopen('song.txt','r')asf:
print(f.read().decode('utf-8'))
#写操作
withopen('song2.txt','w')asf:
#f.write(u'你好'.encode('utf-8'))
#f.write('你好'.decode('utf-8').encode('utf-8'))
f.write('你好')
文件读写时有没有默认编码呢?
Python3中open函数的encoding参数显然是可以不指定的,这时候就会用一个“默认字符编码”。
看下Python3中open函数文档对encoding参数的说明:
encodingisthenameoftheencodingusedtodecodeorencodethe
file.Thisshouldonlybeusedintextmode.Thedefaultencodingis
platformdependent,butanyencodingsupportedbyPythoncanbe
passed.Seethecodecsmoduleforthelistofsupportedencodings.
也就是说,encoding参数的默认值是与平台有关的,比如Window上默认字符编码为GBK,Linux上默认字符编码为UTF-8。
而对于Python2来说,在进行文件写操作时,字节会被直接保存;在进行文件读操作时,如果不手动进行来decode操作自然也就用不着默认字符编码了。但是这时候在不同的字符终端打印的时候,会用当前平台的字符编码自动将字节解码为字符,此时可能会出现乱码。如song.txt文件时UTF-8编码的,在windows(字符编码为GBK)的命令行终端进行如下操作就会出现乱码:
>>>withopen('song.txt','r')asf:
...print(f.read())
...
我们应该尽可能的获取被操作文件的字符编码,并明确指定encoding参数的值。
以上内容为大家介绍了python文件读写与字符编码,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们
最新内容
相关内容
Python网络编程调用接收数据的三种
Python网络编程调用接收数据的三种方法,数据,代码,基础,通用,通讯,服务,网络,培训,方法,报文,最近在使用python进行网络编程开发一个通用的tc为什么开发人员喜欢在机器学习和人
为什么开发人员喜欢在机器学习和人工智能项目中使用Python?,代码,项目,数据,人工智能,平台,异常,增长,灵活,时间,工具,1.Python是灵活的PythoPython实现批量文件的压缩处理
Python实现批量文件的压缩处理,项目,信息,分析,数据,软件,培训,文件夹,文件,源文件,目标,一、前言接到项目求助,需要对上千个文件夹中的文件进数据科学领域Python比R语言更好
数据科学领域Python比R语言更好,数据,公司,工具,时间,项目,工作,庞大,受益,系统,代码,经常有学员问我们,在数据科学领域里,到底是该选Python呢,Python 3.6 中针对文件系统的神奇
Python 3.6 中针对文件系统的神奇方法,数字,代码,数据,标准,信息,培训,首次,工作,文件名,常数,Python3.6首次发布于2016年,尽管它已经发布了很在Python中使用带有列表和字符串文
在Python中使用带有列表和字符串文字的for循环,代码,数字,培训,之间,字符串,列表,语句,文字,奇数,这一点,现在看一下下面的代码,输出1到100之python的数据类型
python的数据类型,数字,较大,数据,培训,变量,表示,字符串,赋值,常量,小数,1.整型Python可以处理任意大小的整数,当然包括负整数,在程序中的表示为何你的Python代码应是扁平与稀疏
为何你的Python代码应是扁平与稀疏的,代码,培训,信息,观察,设计,工具,嵌套,闻闻,程序员,沉思,Python之禅之所以得名,正是由于它那简明扼要的规如何提速优化python代码?
如何提速优化python代码?,代码,时间,数据,新增,写法,包装,情况,下来,面临,工作,Python是一种脚本语言,相比C/C++这样的编译语言,在效率和性能方Python如何在后台自动解压各种压缩
Python如何在后台自动解压各种压缩文件?,代码,综合,工具,分析,检测,培训,文件,文件夹,模块,结尾,一、需求描述编写一个Python程序,每次下载压Python语言自带的数据结构有哪些
Python语言自带的数据结构有哪些,异常,数字,数据,元素,序列,培训,位置,名称,分析,括号,Python作为一种脚本语言,其要求强制缩进,使其易读、美观提升Python数据分析能力的方法
提升Python数据分析能力的方法,分析,数据,工具,代码,时间,环境,报告,信息,培训,标准,1.Pandas分析包这个工具的好处是显而易见的。下面的动画