一、文件编码
对于同一份文件,人的视角和计算机的视角是不相同的,人看到的是文字,计算机看到的0和1组成的编码。因为计算机只能识别0和1,无法直接识别文字,那我们是如何在电脑上看到文字的呢?
计算机按照一定的编码规则,将内容翻译成0和1存入存储设备中,程序需要读取的时候,将其调出,再翻译成文字,通过下图可以更加通俗地理解这个过程。
编码就是一种规则集合,记录了内容和二进制间进行相互转换的逻辑。
计算机中有许多可用编码格式: UTF-8、GBK、Big5等,他们将内容翻译成二进制的方式是不同的。UTF-8是目前全球通用的编码格式,Windows系统自带的记事本中使用的就是UTF-8编码。
文件并不拘泥于文字形式,一张图片、一段视频、一个可执行程序,都可以被保存为一个文件。
文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别。
在日常生活中,文件操作主要包括打开、关闭、读、写等操作。
二、打开文件
使用open函数,可以打开一个已经存在的文件,或者创建一个新文件(即如果这个文件不存在,就会被创建)。
语法:open(name,mode,encoding)
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读、写入、追加等。
encoding:编码格式(推荐UTF-8)
mode常用的三种基础访问模式:
模式 | 含义 | 如果目标文件不存在 |
r | 以只读方式打开文件,文件的指针将会放在文件开头。 | 报错 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。 | 创建新文件进行写入。 |
a | 打开一个文件用于追加。如果该文件已存在,新的内容将会被写入到已有内容之后。 | 创建新文件进行写入。 |
三、读文件
3.1 read()方法
语法:文件对象.read(num)
num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,则默认读取文件中所有的数据。
在与当前写代码文件的同一路径下,创建一个文件,内容为:apple,命名为test1.txt。
首先用open函数打开文件test1.txt,f作为open函数的文件对象(对象是Python中一种特殊的数据类型,拥有属性和方法),然后按照read()方法的语法访问字符。
示例代码1:
f=open('E:/Code-Python/0820/test1.txt','r',encoding='UTF-8')#此处要使用正斜杠'/',如果使用反斜杠'\'会被当成转义字符
content=f.read(2)
print(content)
content=f.read(1)
print(content)
content=f.read(2)
print(content)
输出:
ap
p
le
示例代码2:
f=open('test1.txt','r',encoding='UTF-8')#如果文件与当前代码在同一路径下,name处可直接用文件名
content=f.read()#没有传入num,默认读取文件中所有的数据
print(content)
输出:
apple
3.2 readline()方法
语法:文件对象.readline()
功能:一次读取一行内容
示例代码:
f=open('test1.txt','r',encoding='UTF-8')#如果文件与当前代码在同一路径下,name处可直接用文件名
content=f.readline()#读取一行数据
print(content)
content=f.readline()#读取一行数据
print(content)
content=f.readline()#读取一行数据
print(content)
content=f.readline()#读取一行数据
print(content)
content=f.readline()#读取一行数据
print(content)
content=f.readline()#读取一行数据
print(content)
输出:
虞美人·听雨
【宋】蒋捷
少年听雨歌楼上,红烛昏罗帐。
壮年听雨客舟中,江阔云低、断雁叫西风。
而今听雨僧庐下,鬓已星星也。
悲欢离合总无情,一任阶前、点滴到天明。
3.3 readlines()方法
语法:文件对象.readlines()
功能:按照行的方式把整个文件中的内容一次性全部读取,返回一个列表,其中每一行的数据为一个元素。
示例代码:
f=open('test1.txt','r',encoding='UTF-8')#如果文件与当前代码在同一路径下,name处可直接用文件名
content=f.readlines()
print(content)
输出:
['虞美人·听雨\n', '【宋】蒋捷\n', '少年听雨歌楼上,红烛昏罗帐。\n', '壮年听雨客舟中,江阔云低、断雁叫西风。\n', '而今听雨僧庐下,鬓已星星也。\n', '悲欢离合总无情,一任阶前、点滴到天明。']
注意:“\n”是换行符。
3.4 for循环读取文件行
代码示例:
for line in open('test1.txt','r',encoding='UTF-8'):
print(line)#line临时变量记录了文件的一行数据
输出:
虞美人·听雨
【宋】蒋捷
少年听雨歌楼上,红烛昏罗帐。
壮年听雨客舟中,江阔云低、断雁叫西风。
而今听雨僧庐下,鬓已星星也。
悲欢离合总无情,一任阶前、点滴到天明。
四、写文件
电脑中的文件是保存在硬盘上的,但是我们在输入文件的数据时,输入一个字符之后并不是直接保存在硬盘上,而是先保存到内存的文件缓冲区中,文件缓冲区被装满之后,文件缓冲区的所有数据被一次性输入到硬盘上。(从硬盘中读取文件也是同理,此处无须深究。)这是因为从内存中向硬盘输入数据的消耗相对较大,一个字符一个字符地挨个传输效率较低。
4.1 write()方法
语法:文件对象. write(数据)
功能:写入数据(到文件缓冲区)
代码示例:
f=open('test2.txt','w',encoding='UTF-8')
f.write('Garfield')
time.sleep(50000)#睡眠5万秒,约为833分钟,验证write()方法是否写入数据(到文件缓冲区)
运行后查看文件目录,test2.txt本来不存在,open函数创建了这个新文件:
但是打开test2.txt,里面为空,看到了新文件的创建,说明代码确实运行了,证实了 write()方法将内容写入到了内存中,而非硬盘中。
4.2 flush()方法
语法:文件对象. flush()
功能:将内存缓冲区中的数据中写入硬盘
代码示例:
import time
#创建文件
f=open('test3.txt','w',encoding='UTF-8')
#写入数据
f.write('Garfield')
#内容刷新
f.flush()
#睡眠
time.sleep(50000)#睡眠5万秒,约为833分钟,验证write()方法是否写入数据(到文件缓冲区)
运行后查看文件目录,test3.txt本来不存在,open函数创建了这个新文件,f.write('Garfield')将Garfield写入到了内存中,f.flush()将Garfield写入到了硬盘中,所以我们在test3.txt看到了数据。
4.3 'w'模式与'a'模式
以‘w’模式写入文件,如果文件中已有内容,会被清除重新写入新的内容,如下所示:
在代码同路径下创建文件test4.txt,写入内容:加菲猫。
运行代码:
#打开文件
f=open('test4.txt','w',encoding='UTF-8')
#写入数据
f.write('欧迪')
#内容刷新
f.flush()
test4.txt中原有的内容被清空,只保存了新内容:欧迪。
'a'模式下,如果该文件已存在,新的内容将会被写入到已有内容之后。
在代码同路径下创建文件test5.txt,写入内容:加菲猫爱吃千层面。
运行代码:
#打开文件
f=open('test5.txt','a',encoding='UTF-8')
#写入数据
f.write('\n欧迪爱吃蛋糕')#\n帮助换行
#内容刷新
f.flush()
test5.txt中原有的内容依然保留,并且增加了新内容:欧迪爱吃蛋糕。
五、关闭文件
5.1 close()方法
语法:f.close()
功能:关闭文件对象,也就是关闭对文件的占用 (如果不调用close,同时程序没有停止运行,那么这个文件将一直被Python程序占用)。
close()方法还内置了flush功能。
运行中(或被程序占用)的文件无法删除,我们可以利用这一点来验证一下:
f=open('test1.txt','r',encoding='UTF-8')
content=f.read()
print(content)
time.sleep(50000)
运行后打开文件目录,试去删除test1.txt,文件将一直被Python程序占用,无法删除。
使用close()方法后:
f=open('test1.txt','r',encoding='UTF-8')
content=f.read()
print(content)
f.close()
time.sleep(50000)
运行后打开文件目录,试去删除test1.txt,可以删除,说明文件test1.txt已经被解除占用。
5.2 with open ()方法
语法:
with open(name,mode,encoding) as f:
语句块
name:是要打开的目标文件名
mode:设置打开文件的模式(访问模式):只读、写入、追加等。
encoding:编码格式(推荐UTF-8)
功能:在with open的语句块中对文件进行操作 ,在操作完成后自动关闭close文件,避免遗忘掉close方法(可以理解为自带close关闭功能的open函数,plus版)