文件处理
打开文件的方式
方式一:
1. 打开文件,得到一个句柄并赋值给一个变量 f=open("aa","r",encoding="utf8") 2. 通过句柄对文件进行操作 data=f.read() 3. 关闭文件 f.close()
方式二:
with open("aa","r",encoding="utf8") as f: data=f.read()
打开文件的模式
r,只读模式【默认模式,文件必须存在,不存在则抛出异常】 w,只写模式【不可读;不存在则创建;存在则清空内容】 a,追加写模式【不可读;不存在则创建;存在则只追加内容】 rb,二进制只读模式 wb,二进制只写模式 ab,二进制追加模式 "+" 表示可以同时读写某个文件 r+, 读写【可读,可写】 w+,写读【可读,可写】 a+, 写读【可读,可写】 x, 只写模式【不可读;不存在则创建,存在则报错】 x+ ,写读【可读,可写】 xb
操作文件的方式
f.read() #读取所有内容,光标移动到文件末尾 f.readline() #读取一行内容,光标移动到第二行首部 f.readlines() #读取每一行内容,存放于列表中 f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符 f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符 f.writelines(['333\n','444\n']) #文件模式 自己写换行符
文件的光标问题
f.seek() f.seek(0) 从文件开头重新开始读取 s.seek(offset,whence=0) offset -- 开始的偏移量,也就是代表需要移动偏移的字节数 whence:可选,默认值为 0。 seek(0,0) 默认移动到文件开头或简写成seek(0) seek(x,1) 表示从当前指针位置向后移x(正数)个字节,如果x是负数,则是当前位置向前移动x个字节 seek(x,2) 表示从文件末尾向后移x(正数)个字节,如果x负数,则是从末尾向前移动x个字节 典型的例子:模仿tail -f import time with open('test.txt','rb') as f: f.seek(0,2) #将光标移动到文件末尾,再向后移动0个字节数 从文件末尾开始读 while True: line=f.readline() if line: print(line.decode('utf-8')) else: time.sleep(0.2)
修改文件的方式
import os #以只读的方式打开源文件 以写的方式创建新的文件 with open('aa.txt','r',encoding='utf-8') as r_f,open('bb.txt','w',encoding='utf-8') as w_f: for line in r_f: #将源文件内容写入新文件 并且修改 if line.startswith('你好'): line='修改了\n' w_f.write(line) #目前就有了两个文件,但是只需要一个修改后的文件,原理就是删除源文件,将新文件重命名 ##删除和重命名文件 os.remove('aa.txt') os.rename('bb.txt','aa.txt')
二进制方式操作文件
读出二进制文件的方法:
with open('aa','rb') as f: print(f.read()) f.seek(0) print(f.read().decode('gbk')) #windows上是gbk ''' b'\xbb\xb9\xd3\xd0\xca\xab\xba\xcd\xd4\xb6\xb7\xbd\r\n' 还有诗和远方 '''
写入二进制文件的方法:
with open("aa","wb") as f: f.write("还有诗和远方\n".encode("utf8"))
使用二进制方式,保存图片
with open('ff.jpg','rb') as read_f,\ open('wuwu_new.jpg','wb') as write_f: write_f.write(read_f.read())