Python——文件处理(Open)
文件处理
Python提供了用于文件处理的内置函数Open来进行文件处理操作。通常所说文件分为两类:文本文件和二进制文件。文本文件就是简单的文本,二进制文件包含了只有计算机能够识别的二进制数据。
文件处理主要包含:文件创建、打开、追加、读、写、关闭等操作。
文件处理操作
1.文件处理流程
在对文件进行处理操作时,采用Python内置函数Open()函数,需要文件路径和文件名、文件的打开模式、文件的编码方式等。(注:为了便捷,需要处理的文件一般与Python源文件放在相同的文件路径下)
文件处理流程:打开文件——读/写操作——关闭文件。
1)手动关闭文件
"文件处理"txt文档内容:
Python源码:
1 # open(打开文件)——read(阅读文件)——close(关闭文件) 2 # 文件名为"文件处理"txt格式的文档与源文件在相同的路径之下 3 file = open('文件处理','r',encoding='utf-8') 4 # ‘文件处理’:是文件路径和文件名,txt文件与源文件相同路径下,直接写文件名打开文件; 5 # 'r':以只读的形式打开文件; 6 # encoding='utf-8':编码方式为utf-8,不指定编码方式默认系统编码。 7 data = file.read() # 阅读文件 8 print(data) # 打印内容 9 file.close() # 关闭文件
输出结果:
2)系统自动关闭文件
with:采用with关键字方法打开文件,不再使用close方法手动关闭文件,系统会自动关闭文件。
<1> 打开一个文件
1 with open('文件处理','r',encoding='utf-8') as file: # with...as... 冒号 2 data = file.read() # 缩进 3 print(data)
<2> 打开多个文件
1 with open('文件处理','r',encoding='utf-8') as file , open('文件处理','r',encoding='utf-8') as file_one: # 打开多个文件时,中间使用逗号分隔 2 data = file.read() 3 data_one = file_one.read() 4 print(data) 5 print(data_one)
2.文件处理基本模式
文件处理基本模式有:‘r模式,‘w’模式,‘a’模式。
- 'r':以只读模式打开,只能读取文件内容但不能编辑/删除/写入文件的任何内容,文件不存在读时会抛出异常
- 'w':以写入模式打开,如果文件存在将会删除文件内所有内容,然后打开这个文件写入内容
- 'a':以追加模式打开,写入到文件内的任何数据会自动添加到末尾
1)’r‘:只读模式,读出来的数据全部为字符串
<1> 语法使用
1 file = open('文件处理','r',encoding='utf-8') # ‘r’:只能阅读,不能写
<2> ’r‘模式方法
① readable():判断文件是否为只读,返回布尔值(True 或 Fasle)
1 file = open('文件处理','r',encoding='utf-8') 2 print(file.readable()) 3 4 # =>True
② readline():一次阅读一行(每一行有换行符,打印出来会有一空行,可用end=''取消空行)
1 file = open('文件处理','r',encoding='utf-8') 2 print('1',file.readline(),end='') # 第1行 3 # =>1 静夜思 李白 4 print('2',file.readline(),end='') # 第2行 5 # =>2 床前明月光, 6 print('3',file.readline(),end='') # 第3行 7 # =>3 疑是地上霜。
③ readlines():打印文件全部内容存放于一个列表中
1 file = open('文件处理','r',encoding='utf-8') 2 print(file.readlines()) 3 # # =>['静夜思 李白 ', '床前明月光, ', '疑是地上霜。 ', '举头望明月, ', '低头思故乡。 ', ' ', '一寸光阴一寸金,寸金难买寸光阴 ', ' ', 'I love you']
2) 'w':只写模式,只能写入字符串
- 文件存在时:只写模式,只能写,不能读,读会报错,清空原有文件内的所有内容,再重新写入;
- 文件不存在时:只写模式,会创建一个新的文件,再写入。
<1> 语法使用
1 file = open('文件处理','w',encoding='utf-8') # ‘w’:只能写,不能读 2 # file.read() # 不能读,只能写,会报错
<2> 'w'模式方法
① write():写入信息(注意‘ ’)
1 file = open('文件处理','w',encoding='utf-8') 2 file.write('Are you ok')
② writable():判断是否为只写,返回布尔值(True 或 False)
1 file = open('文件处理','w',encoding='utf-8') 2 file.writable()
③ writelines():写入内容,以列表形式传递
1 file = open('文件处理','w',encoding='utf-8') 2 # file.writelines(['你真棒! ','我爱你! '])
3)’a‘:追加模式,在原文件内容的基础之上再添加新内容,不会清空原始内容;含有’r‘/'w'模式所有方法,追加内容在文件末尾。
<1> 语法使用
1 file = open('文件处理','a',encoding='utf-8') # ‘a’:在原始数据之上追加内容 2 file.write('一寸光阴一寸金,寸金难买寸光阴 ') 3 file.writelines(['I love you ','Are You OK '])
3.文件处理其它模式
1)‘+’模式:表示同时读写某个文件
- ‘r+’:以读写方式打开文件,可对文件进行读和写操作;
- ‘w+’:清空文件内容,然后以读写方式打开文件;
- ‘a+’:以读写方式打开文件,并把文件指针移动到文件末尾。
2)‘b’模式:表示以字节的方式操作文件(注:‘b’模式不能指定编码)
<1> ‘rb / r+b’:
"‘b‘模式打开文件"txt文本内容
Python源码
1 with open("'b'模式打开文件",'rb') as file: 2 data = file.read() 3 print(data) 4 print(data.decode('utf-8'))
输出结果
<2> ‘wb / w+b’:
“'b'模式打开文件1”txt文本内容:空文本
Python源码
1 with open("'b'模式打开文件1",'wb') as file: 2 # 方法一 3 file.write(bytes('普天同庆 ',encoding='utf-8')) 4 # 方法二 5 file.write('日月同辉 '.encode('utf-8'))
输出结果
<3> ‘ab / a+b’
“'b'模式打开文件1”txt文本内容
Python源码
1 with open("'b'模式打开文件1",'ab') as file: 2 file.write('九星连珠 '.encode('utf-8'))
输出结果
4.文件操作其它方法
1)”文件操作其它方法“txt内容
2)方法
<1> closed():判断文件是否关闭,返回布尔值(True/False)
1 file = open('文件操作其它方法','r',encoding='utf-8') 2 print(file.closed)
<2> encoding():显示文件打开的编码模式
1 file = open('文件操作其它方法','r',encoding='utf-8') 2 print(file.encoding) 3 # =>utf-8
<3> flush():刷新缓冲区
1 file = open('文件操作其它方法','r',encoding='utf-8') 2 file.flush()
<4> name():显示文件名
1 file = open('文件操作其它方法','r',encoding='utf-8') 2 print(file.name) 3 # =>文件操作其它方法
<5> read(x):阅读字符串,x为参数,read(x)代表阅读x个字符,其余的文件内光标移动都是以字节为单位如seek、tell等。
1 file = open('文件操作其它方法','r',encoding='utf-8') 2 print(file.read(2)) 3 # =>你好
<6> tell():显示光标当前位置
1 file = open('文件操作其它方法','r',encoding='utf-8') 2 print(file.tell()) 3 # =>0 4 file.readline() 5 print(file.tell()) 6 # =>7
<7> seek():用来控制光标的移动位置,默认从文件开头算起
1 file = open('文件操作其它方法','r',encoding='utf-8') 2 file.seek(40) 3 print(file.tell()) 4 # =>40
<8> truncate():文件截断(在写模式操作'w')
1 file = open('文件操作其它方法','w',encoding='utf-8') 2 print(file.truncate(10))
5.seek(x)模式
seek(x):用来控制光标的移动位置,默认从文件开头算起.要想使用seek的其它模式需要将其装换为rb模式,字节操作模式。
”seek方法“txt内容:
1)seek(x,0):x:移动字节数;0:基于文件开头位置而移动
1 file = open('seek方法','rb') 2 file.seek(10,0) 3 print(file.tell()) 4 # =>10 5 file.seek(5,0) 6 print(file.tell()) 7 # =>5 8 file.close()
2)seek(x,1):x:移动字节数;1:基于上一次的光标位置而移动
1 file = open('seek方法','rb') 2 file.seek(10,0) 3 print(file.tell()) 4 # =>10 5 file.seek(5,1) 6 print(file.tell()) 7 # =>15 8 file.close()
3)seek(x,2):x:移动字节数;2:基于文件末尾光标位置而移动
1 file = open('seek方法','rb') 2 file.seek(-15,2) 3 print(file.tell()) 4 # =>7 5 data = file.read() 6 print(data.decode('utf-8')) 7 # =>bcdef 8 # =>你好!
4)举例:读取文件最后一行
<1> 方法一:遍历内容,形成列表,取最后一个(占内存)。
1 # 第一种: 2 file = open('seek方法','r',encoding='utf-8') 3 data = file.readlines() 4 print('最后一行:%s'%data[-1]) 5 # =>最后一行:你好! 6 7 # 第二种: 8 file = open('seek方法','rb') 9 data = file.readlines() # 阅读所有内容,形成列表,每一行为一个元素 10 print('最后一行:',data[-1].decode('utf-8')) 11 # =>最后一行:你好!
<2> 方法二:seek方法直接取最后一行。
1 file = open('seek方法','rb') 2 for i in file: # 一行一行阅读内容 3 offs = -3 # 设置偏移量 4 while True: 5 file.seek(offs,2) # 倒着阅读 6 data = file.readlines() # 取出内容,形成列表,每一行为一个元素 7 if len(data) > 1: # 判断元素个数,多于两个则表示取出了两行 8 print('最后一行:%s'%data[-1].decode('utf-8')) 9 break 10 offs *= 2 # 继续增加偏移量
6.循环读取文件
for循环可以循环文件内容
1 file = open('文件处理','r',encoding='utf-8') 2 for i in file: 3 print(i,end='')