python文件处理
#写文件 >>> f=open("test.log","w") #"w"写入模式 >>> f.write("test line ") 10 >>> f.write("test line2") 11 >>> f.close() #操作完毕记得关闭文件! #读文件 >>> f=open("test.log","r") #"r"只读模式 >>> print(f.read()) test line test line2 >>> f.close() #关闭文件对象
文件句柄 f = open('文件路径', '模式',encoding='编码')
文件编码 encoding:
open() 文件是由操作系统打开,如果没有手动设置编码,那么默认操作系统会用自己的编码去打开文件,在linux下是utf-8,windows下是 gbk。
打开模式:
- r 只读模式(默认),文件必须存在,否则会抛异常
- w 写入模式,需要注意:若文件已存在,会覆盖掉原来的内容!
- x 写入模式,若文件已存在,会报异常
- a 追加。不存在则创建,存在就追加
- t 文本模式打开 (默认)。 open()函数默认的打开模式是'rt'
- b 以二进制读文件。对于非文本文件,使用b模式,“b”表示以字节的方式操作
- + 可读写模式
文件对象的方法:
- f.close() 回收操作系统打开的文件
- f.read([size=-1]) size未指定则读取整个文件,读取到的是字符串
# f.read(10) 如果文件以t(文本模式)打开,则读取10个字符 若文件以b(二进制模式)打开,则读取10个字节 # f.read() >>> f = open('a.txt','r') >>> data = f.read().strip() >>> data 'test line1 test line2' >>> print(data) test line1 test line2 >>> f.close()
- f.readline([size=-1]) 每次读一行内容,所以,读取时占用内存小,比较适合大文件
>>> f = open('a.txt') >>> f.readline() 'test line1 ' >>> f.readline() 'test line2 ' >>> f.readline() '' >>> f.readline() '' >>> f.close()
- f.readlines([size=-1]) 读取整个文件所有行,保存在一个列表中,每行作为一个元素
>>> f=open("a.txt") >>> data=f.readlines() >>> f.close() >>> data ['test line1 ', 'test line2 ', ' '] #读取到的是一个列表 >>> for line in data: ... print(line.strip()) ... test line1 test line2
- f.tell() 返回当前文件指针的位置
>>> f=open('record.txt') >>> f.read(5) '小客服:小' >>> f.tell() 13
- f.seek(offset,from) 移动光标, 从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节
# cat a.txt test line1 test line2 >>> f=open("a.txt") >>> f.seek(8) #把光标移到第8个字符的后面 8 >>> f.tell() 8 >>> f.read() 'e1 test line2 ' >>> f.close()
- f.truncate([size=file.tell()]) 从文件的首字符开始截断 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除。文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
>>> f=open('a.txt','r+') #文件打开必须是可写的,在r+或a或a+模式下测试 >>> f.truncate(8) 8 >>> f.read() 'test lin' >>> f.tell() 8 >>> f.close()
- f.write(str) 将字符串str写入文件,返回写入的字符串长度
- f.writelines(seq) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符
>>> l = ['hello ','world '] >>> f=open("test.log","w") >>> f.writelines(l) >>> f.close() # cat test.log hello world
with管理上下文
为了防止文件操作完忘记执行 f.close()来关闭文件,可以使用with 关键字来管理上下文, 当with代码块执行完毕时,内部会自动关闭并释放文件资源。
>>> with open('server.py') as f: ... for i in f: ... print(i.strip()) ... #with还支持同时对多个文件的上下文进行管理 >>> with open('a.txt','r') as obj1,open('b.txt','w') as obj2: ... data = obj1.read() # 文件较大时,应使用for循环一行一行的读取, for i in obj1: obj2.write(i) ... obj2.write(data) ... 4
修改文件内容:
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: for line in read_f: line=line.replace('test','xxxx') write_f.write(line) os.rename('.a.txt.swap','a.txt') os.remove('a.txt')
把一个文件的内容插入到另一个文件某个指定字段的前面
#!/usr/bin/python3 with open('add.txt','r') as obj1,open('filebeat.yml','r') as obj2: add_content = obj1.read() content = obj2.read() pos = content.index('output.kafka:') contents = content[:pos] + add_content + content[pos:] with open('filebeat.yml','w') as f: f.write(contents)