python学习之【文件读写】

发布于:2023-09-22 ⋅ 阅读:(71) ⋅ 点赞:(0)

前言

上一篇文章​ ​ python学习——【第十四弹】 ​​​中学习了python中的包与内置模块,这篇文章接着学习python中的文件读写。

编码方式

在学习文件读写之前,我们先了解下python当中的编码方式:
在这里插入图片描述

字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。
字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。
一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。


ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
符号:英文标点为一个字节,中文标点为两个字节。例如:英文句号 . 占1个字节的大小,中文句号 。占2个字节的大小。
UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。
UTF-32 编码中,世界上任何字符的存储都需要 4 个字节。

python的解释器使用的Unicode(内存),python文件(.py)在磁盘上使用的是UTF-8(外存)。

python3中默认使用的是UTF-8的编码;

我们可以使用sys模块中的getdefaultencoding()获取默认的编码格式

import sys
print(sys.getdefaultencoding())
# utf-8

在计算机内存中,统一使用的是Unicode编码,当需要保存在硬盘或者是需要传输的时候,就会转换为UTF-8编码:

当我们用记事本进行编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里;编辑完成后进行保存,会再将Unicode转换为UTF-8保存到文件中。

在这里插入图片描述
我们看用python文件用记事本打开,然后另存时默认的编码类型:

在这里插入图片描述
而记事本的保存的默认编码格式是ANSI,(准确说,并不存在哪种具体的编码方式叫做ANSI,它只是一个Windows操作系统上的别称而已。在中文简体Windows操作系统上,ANSI就是GBK),如果我们直接用python去新建一个txt文本文档的文件,由于编码格式的不兼容,因此会发生乱码:

在这里插入图片描述
在这里插入图片描述
为了避免编码格式不兼容的问题,我们可以在代码中进行修改写入数据的编码格式为UTF-8:

f = open("编码.txt", "w",encoding='UTF-8')#将输入数据的编码格式改为UTF-8
f.write("你好!世界!")
f.close()

在这里插入图片描述
想要对编码格式多加了解的伙伴,可以参考这篇文章:​ ​点击查看​​​。​

常见的文件打开模式

按照文件数据的组织形式,文件分为以下两个大类:

 文本文件:存储的是普通“字符”文本,默认为Unicode字符集,可以使用记事本程序打开

   二进制文件: 把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,如图片文件(.png  .jpeg等)以及  .doc文档等。 常见的打开模式:

  r  以只读的模式打开文件,文件的指针将会放在文件的开头

  w   以只写的模式打开文件  如果文件不存在就创建,如果文件存在就覆盖文件的原有内容,文件指针在文件的开头

  a   以追加的模式打开文件,如果文件不存在就创建,文件指针在文件开头;如果文件存在,则在文件末尾追加内容,文件指针在源文件末尾

  b 以二进制的方式打开文件  不能单独使用,需要与共它模式一起使用 如 rb(只读的方式打开二进制文件)或者wb(只写的方式打开二进制文件)

  + 以读写的方式打开文件,不能单独使用,需要和其他模式一起使用 比如 a+

需要注意的是:我们在进行对文件的读写操作时,代码最后要对文件进行close()关闭操作:close()操作把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源。
r 只读

以只读的模式打开该文件

file_r=open('a.txt','r')
print(file_r.read())#读取文件内容
file_r.close() #关闭文件 只要我们打开了文件,在代码结束时就要写上关闭文件的代码,以释放资源。

说到只读,这里有文件对象的几种常用方法,我们可以用只读的方式来查看各个方法的功能:

read([size]) 从文件中读取size个字节或者是字符的内容的返回,如果省略[size]的话,就会从文件的开头一次性读取到文件的末尾;

readline()  从文本文件中读取第一行内容;

readlines()  把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表中返回;

seek(offest,[whence])  把文件指针移动到新的位置,offset表示相对于whence的位置;

tell()    返回文件指针的当前位置;

flush()  把缓冲区的内容写入到文件中,但是不关闭文件​

我们先读取a.py中的全部内容:

在这里插入图片描述
然后用读取文件对象的常用方法读取a.txt :

# read([size])   从文件中读取size个字节或者是字符的内容的返回,如果省略[size]的话,就会从文件的开头一次性读取到文件的末尾
file_r=open('a.txt','r')
print(file_r.read(5)) #返回5个字节
file_r.close()

print('------------------------\n')

# readline()  读取文本中的第一行内容
file_rl=open('a.txt')
print(file_rl.readline())
file_rl.close()

print('------------------------\n')

# readlines()   把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表中返回
file_rls=open('a.txt','r')
print(file_rls.readlines())
file_rls.close()

在这里插入图片描述

seek()

seek()的括号中输入字节数,文件的指针就会从文件开头往后移动几个字节

file_seek=open('a.txt','r')
file_seek.seek(2)
print((file_seek.read()))
file_seek.close()  #llo world

a.txt:
在这里插入图片描述
需要注意:如果我们需要读取的字节数必须是正确的字节数;比如在读取汉字时,如果是输入2,而UTF-8的编码中一个汉字是3个字节,会导致程序报错。

tell()

返回文件指针的当前位置

file=open('a.txt','r')
file.seek(2)
print(file.read())
print(file.tell()) #返回指针当前所在的位置
file.close()

在这里插入图片描述

flush()

把缓冲区的内容写入到文件中,但是不关闭文件

file=open('b.txt','a')#采用追加的方式打开文件
file.write('hello')
file.flush()  #把缓冲区的内容写入到文件中,但是不关闭文件
file.write('world')
file.close()

但是我们将flush()和close()区分开来,flush()不会关闭该文件,也就是说可以在flush()代码执行之后可以继续往文件里写入数据;但是close()执行后就不能再往文件中写入数据了,否则会报错。

在这里插入图片描述

w 只写

以只写的模式打开文件 ,如果文件不存在就创建,如果文件存在就覆盖文件的原有内容,文件指针在文件的开头:
在这里插入图片描述
在这里插入图片描述
只读的模式打开a.txt,我们发现a.txt文件中的原有内容被覆盖。

这里我们用到了文件对象的写入方法 : write(str) 将字符串str内容写入文件

还有一种常用的文件对象的写入方法:

writelines(s_list) 将字符串列表s_list写入文本文件,并且不添加换行符

s_lis1=['hello','world','hello','python']
file_wl=open('a.txt','w')
file_wl.writelines(s_lis1)
file_wl.close()

在这里插入图片描述
使用该方法需要注意的是写入的必须是字符串列表,如果不是字符串列表会报类型错误:
在这里插入图片描述

a 以追加的模式打开文件

以追加的模式打开文件,如果文件不存在就创建,文件指针在文件开头;如果文件存在,则在文件末尾追加内容,文件指针在源文件末尾。

file_a=open('a.txt',"a")
file_a.write('python') #写入'python'
file_a.close()

在这里插入图片描述
在这里插入图片描述

b 打开二进制的文件

二进制文件: 把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,如图片文件(.png .jpeg等)以及 .doc文档等。

b 不能单独使用,需要与共它模式一起使用: 如rb或者wb

# 打开读取源文件
src_file=open('befor.png','rb')
# 打开写入目标文件
target_file=open('after.png','wb')
# 将从源文件中读取的文件写入目标文件
target_file.write(src_file.read())
# 将目标文件和源文件关闭
target_file.close()
src_file.close()

在这里插入图片描述

每篇一语

不要在夕阳西下时幻想,要在旭日东升时努力。

如有不足,感谢指正!

本文含有隐藏内容,请 开通VIP 后查看