一.文件处理流程
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
f=open('a.txt','w') f.write('111111 ') f.close()
二.基本操作
2.1 文件编码
#不指定打开编码,默认使用操作系统的编码,windows为gbk,linux为utf-8,与解释器编码无关 f=open('chenli.txt',encoding='gbk') #在windows中默认使用的也是gbk编码,此时不指定编码也行 f.read()
2.2 文件打开模式
f=open('文件名','模式') f=open('a.txt','r+') #读写 f=open('a.txt','w+') #写读 f=open('a.txt','a+') #追加并且读 。 。 。 。 。 。
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
- r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
- w,只写模式【不可读;不存在则创建;存在则清空内容】
- x, 只写模式【不可读;不存在则创建,存在则报错】
- a, 追加模式【可读; 不存在则创建;存在则只追加内容】
"+" 表示可以同时读写某个文件
- r+, 读写【可读,可写】
- w+,写读【可读,可写】
- x+ ,写读【可读,可写】
- a+, 写读【可读,可写】
"b"表示以字节的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
常见的mode取值组合
r或rt 默认模式,文本模式读 rb 二进制文件 w或wt 文本模式写,打开前文件存储被清空 wb 二进制写,文件存储同样被清空 a 追加模式,只能写在文件末尾 a+ 可读写模式,写只能写在文件末尾 w+ 可读写,与a+的区别是要清空文件内容 r+ 可读写,与a+的区别是可以写到文件任何位置
2.3 上下文管理
1 #上下文管理 2 with open('a.txt','r',encoding='utf-8') as f,open('b.txt') as b_f: 3 # print(f.read()) 4 print('====>')
补充
1 for i in range(3): 2 print(i) 3 # continue 4 if i == 1: 5 break 6 else: 7 print('=============>') #当for循环不被break打断,就会执行else的代码 8 9 with open('a.txt','r',encoding='utf-8') as read_f, 10 open('aa.txt','w',encoding='utf-8') as write_f: 11 12 for line in read_f: 13 write_f.write(line) 14 else: 15 print('write successfull')
2.4 文件的操作方法
f.read 读取文件所有内容
f.read 读取文件所有内容
f.readline 读取一行内容
f.readlines 读取每行内容,返回一个列表
f.close() 关闭文件
f.seek() 移动指针到指定位置
f.tell() 获取当前指针位置
f.flush() 把缓存写入到硬盘
f.mode() 显示文件打开格式
f.truncate() f.truncate(10)截取文件0-10字符,超出部分删除
f.writelines() 传入一个列表,并将列表每个元素写入到文件
f.xreadlines() 已迭代方式循环文件,每循环一次,只读一行。处理大文件效率高
1 #不常用的,了解 2 3 with open('a.txt','r',encoding='utf-8') as f: 4 print(f.read(4)) #数字指的是读的是字符 5 6 with open('a.txt','rb') as f: 7 print(f.read(1)) #数字指的是读的是字符 8 9 10 with open('a.txt','r',encoding='utf-8') as f: 11 f.seek(3) #seek内指定的数字代表字节 12 print(f.tell()) #当前光标所在的位置 13 print(f.read()) 14 15 with open('aa.txt','r+',encoding='utf-8') as f: 16 # f.seek(3) #seek内指定的数字代表字节 17 # print(f.read()) 18 19 f.truncate(1) 20 21 22 with open('b.txt','rb') as f: 23 f.read() 24 f.seek(3) #默认情况,是以文件起始位置作为开始,往后移动3个bytes 25 f.read(1) 26 print(f.tell()) 27 f.seek(2,1) #1 代表以当前光标所在的位置为开始,往后移动2个 bytes 28 print(f.tell()) 29 30 f.seek(-1,2) #2表以当前光标所在的位置为开始,往后移动2个 bytes 31 print(f.tell()) 32 33 f.seek(0,2) 34 35 with open('c.txt','r',encoding='utf-8') as f: 36 f.seek(0,2) 37 print('====>',f.read())
2.5 文件的修改
1 import os 2 with open('a.txt','r',encoding='utf-8') as read_f, 3 open('.a.txt.swap','w',encoding='utf-8') as write_f: 4 for line in read_f: 5 if line.startswith('hello'): 6 line='哈哈哈 ' 7 write_f.write(line) 8 9 os.remove('a.txt') 10 os.rename('.a.txt.swap','a.txt')