打开方式
方式一:
f = open() 参数常用对应位置 文件地址 mode=相关模式 打开的编码格式encoding= 最后一定要 f.close 在对文件进行关闭后对f的相关操作都会无效化
方式二:
with open() as f: 和f=open相比省略了f.close() 参数常用对应位置 文件地址 mode=相关模式 打开的编码格式encoding= 这边的文件位置 考虑到字符串转义问题 \ 需要 \\ 或者直接在字符串之前加 r 如果当前打开文件和执行文件在一个文件夹(不包括子文件夹) 可以以相对位置直接文件名打开
操作方法
.read() 读取打开文件的内容 可以跟位置参数 读取对应的是几个单位 比如t模式读取一个文字单位 ,b模式读取一个字节单位 .write() 写入文件的内容,后面参数为写入文件内容 .writeable() 判断是否可写 返回值True False .readable() 判断是否可读 返回值True False .readlines() 读取所有的行的内容 最后换回形式为一个字典 列入 ['jinpan','python','play'] .readline() 读取文件的一行内容,通常用于for循环中循环读取 .writelines() writelines(list)为写入方式,函数writelines可以将list写入到文件中,但是不会在list每个元素后加换行符,所以如果想每行都有换行符的话需要自己再加上。
.truncate() 跟截断的字节数 保留文件对象截断字节数量的
.tell() 查看光标移动了多少位 bytes
.flush() 将内存中的文件内容直接刷到硬盘
.seek() offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
文件的操作模式
默认的文件模式都为t模式 t为文本模式,该模式中字符串为一个单位,字母数字也属于一个单位 r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 个人理解:为读取模式该模式下读取的为文本模式的相关内容 若文件读取时候文件不存在会报错 rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 个人理解:为二进制字节的读取模式 该模式下读取的为字节(bytes)模式下的相关内容,在这模式里比如编码格式为utf8,那么一个文字对应3个字节,1个字母对应1个字节 w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 个人理解:为文本的写入模式 不过为覆盖写入 wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 个人理解:为二进制的写入模式 不过为覆盖写入 通常用于储存二进制文件:照片视频 a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 个人理解:追加文本模式 在文本末尾添加内容 ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 个人理解:追加二进制字节写入模式 在文本末尾添加 r+ 打开一个文件用于读写。文件指针将会放在文件的开头。 个人理解:可读可写文本 不过该模式会覆盖相关的原位置内容,写入起始点在文件开头 rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 个人理解:可读可写bytes 不过该模式会覆盖相关的原位置内容,写入起始点在文件开头 w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 个人理解:可读可写文本 该模式会在with open 环节就 直接清空文件内容然后写入新内容 wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 个人理解:可读可写二进制 该模式会在with open 环节就 直接清空文件内容然后写入新内容 a+ 对应a 它可读 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
操作文件的一些疑难困惑点:
对于t模式下一个文字1个单位 b模式下3个bytes read() 读取时候要根据相关的模式进行判断读取数量 否则报错
文件模式处于 b模式时候不需要encoding的参数
seek() 和 read() 方法搭配使用的时候需要注意seek的偏移单位始终是字节 seek偏移单位也可以取负值 0为开头位置 1为指针当前位置 2为结尾位置
不合理的指针偏移和修改会导致文章乱码
read() b模式读取相关单位 (也和光标位置有关系)读取单位量 不符合当前格式规范 会报错
操作文件的一些实例:
实时监测文件动态
监测文件内容(Ps:使用时候要注意,要先运行监测文件内容代码后再进行修改文件代码)
with open(r'test01.txt','rb') as f: # 先将光标移动到文件末尾 f.seek(0,2) while True: res = f.readline() # 查看光标移动了多少位 bytes # print(f.tell()) if res: print("新增的文件内容:%s"%res.decode('utf-8')) # 说明有人操作当前文件 # else: # # 说明文件没有被任何人操作 # print('暂无其他人操作该文件')
修改文件内容
import time res = time.strftime('%Y-%m-%d %X') # print(res,type(res)) # with open(r'test01.txt','a',encoding='utf-8') as f: f.write('%s egon给jason发了1个亿的工资\n'%res)
截断案例:
with open(r'test','a',encoding='utf-8') as f: f.truncate(6) # 接收的字节的长度 整型 # 保留0~6字节数 后面的全部删除(截断)
修改文件:(各有优点)
方法1
# 修改文件 # 先将数据由硬盘读到内存(读文件) # 在内存中完成修改(字符串的替换) # 再覆盖原来的内容(写文件) # with open(r'test02.txt','r',encoding='utf-8') as f: # data = f.read() # print(data) # print(type(data)) # # with open(r'test02.txt','w',encoding='utf-8') as f: # res = data.replace('egon','jason') # print(data) # f.write(res) """ 优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间 缺点:当文件过大的情况下,可能会造成内存溢出 """
方法2
# 创建一个新文件 # 循环读取老文件内容到内存进行修改 将修改好的内容写到新文件中 # 将老文件删除 将新文件的名字改成老文件名 import os with open(r'test02.txt','r',encoding='utf-8') as read_f,\ open(r'test02.swap','a',encoding='utf-8') as write_f: for line in read_f: new_line = line.replace('jason','egon') write_f.write(new_line) os.remove('test02.txt') os.rename('test02.swap','test02.txt') """ 优点:内存中始终只有一行内容 不占内存 缺点:再某一时刻硬盘上会同时存在两个文件 每日默写 修改文件的两种方式 加上你自己的逻辑思维 """