千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:太原千锋IT培训  >  技术干货  >  python文件读写与字符编码

python文件读写与字符编码

来源:千锋教育
发布人:xqq
时间: 2023-11-06 09:59:58

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相关知识,请关注IT培训机构:千锋教育。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

python的type怎么用

2023-11-06

python要懂linux吗

2023-11-06

Python之特殊方法与多范式

2023-11-06

最新文章NEW

如何用python输入数字

2023-11-06

学python需要java吗?

2023-11-06

python字符串大小写转换

2023-11-06

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>