python 文件操作
文件操作的一般流程
1,找到文件:通过路径
2,打开文件:得到文件的句柄并赋给一个变量
3,通过句柄对文件进行操作
4,保存/关闭文件
1,一个简单的文件读取的示例代码
1 data=open("d:/aa.txt",encoding="utf-8").read()#请确定文件的编码 2 print(data) 3 4 输出: 5 o牛#文件内容
2,文件句柄的示例
1 f=open("d:/aa.txt",encoding="utf-8")#文件对象又称为文件句柄,包含文件名,大小,内存的起始位置,字符集,打开文件的模式 2 print(f) 3 4 输出: 5 <_io.TextIOWrapper name='d:/aa.txt' mode='r' encoding='utf-8'>
注意:文件的读取是根据文件的指针位置往下读取的,因此如果连续读取而不重置指针位置的话,后续的读取都会读不到任何信息。
3,写入文件
1 f=open("d:/aa1.txt",'w',encoding="utf-8")#以写的模式创建文件,如果与现有文件同名则会覆盖原文件 2 data=f.write("我厉害了") 3 data=f.write("我太厉害了") 4 5 输出文件: 6 我厉害了我太厉害了
注意:以写的模式创建文件,如果与现有文件同名则会覆盖原文件
4,追加文件内容
1 f=open("d:/aa1.txt",'a',encoding="utf-8")#以追加模式编辑, 2 data=f.write("\n我厉害了\n") 3 data=f.write("我太厉害了") 4 f.close() 5 6 输出: 7 我厉害了我太厉害了 8 我厉害了 9 我太厉害了
5,单行读取方法及for循环
1 f=open("d:/aa.txt",'r',encoding="utf-8") 2 data=f.readline()#读取一行 3 print(data) 4 输出:天长地久 5 6 #读取前5行 7 for i in range(5): 8 print(f.readline()) 9 10 输出: 11 ---叶倩文&林子祥--- 12 13 你是我一生最好的选择 14 15 你是我一生最美的守候 16 17 所有的等候 只为一生相守 18 19 靠在我的胸口
注意:每读取1行,则文件指针的对应行数就会发生变化,因此连续读取文件时,不会每次都遍历文件内容,而是从上次结束的行的下一行开始读取
6,文件内容转列表
1 f=open("d:/aa.txt",'r',encoding="utf-8") 2 for i in f.readlines(): 3 print(i.strip()) 4 5 输出: 6 天长地久 7 ---叶倩文&林子祥--- 8 你是我一生最好的选择 9 你是我一生最美的守候 10 所有的等候 只为一生相守 11 靠在我的胸口 12 。。。
注意:用strip()方法去除换行符或空格
否则结果如下
1 f=open("d:/aa.txt",'r',encoding="utf-8") 2 data=f.readlines() 3 print (data) 4 5 输出: 6 ['\ufeff天长地久\n', '---叶倩文&林子祥---\n', '你是我一生最好的选择\n', '你是我一生最美的守候\n', '所有的等候\u3000只为一生相守\n',.....]
7,打印文件内容,跳过第9行
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 for index,line in enumerate(f.readlines()): 2 if index==9: 3 print("-----------我是分割线-----------") 4 continue 5 print(line.strip()) 6 7 输出: 8 天长地久 9 ---叶倩文&林子祥--- 10 你是我一生最好的选择 11 你是我一生最美的守候 12 所有的等候 只为一生相守 13 靠在我的胸口 14 不用在频频回首 15 总是想低头 握住你的手 16 总在你回眸 我看见温柔 17 -----------我是分割线----------- 18 从此牵手白头 19 不在为谁停留 20 。。。
注意:上面的方法把文件内容一次性读取到内存,可能导致性能问题,因此是一种low的方法
聪明的做法是读取一行,打印一行,放弃一行,内存里只保留当前有效的一行
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 f=open("d:/aa.txt",'r',encoding="utf-8") 2 i=1 3 for line in f: 4 if i==9: 5 print("-----------我是分割线-----------") 6 i += 1 7 continue 8 print (line) 9 i+=1 10 11 输出: 12 天长地久 13 14 ---叶倩文&林子祥--- 15 16 你是我一生最好的选择 17 18 你是我一生最美的守候 19 20 所有的等候 只为一生相守 21 22 靠在我的胸口 23 24 不用在频频回首 25 26 总是想低头 握住你的手 27 28 -----------我是分割线----------- 29 深情比酒浓 把它放在心头 30 31 从此牵手白头 32 。。。
8,文件指针操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 f=open("d:/aa.txt",'r',encoding="utf-8") 2 print (f.tell())#打印文件指针所在的字符的位置 3 print (f.readline())#读取一行 4 print (f.readline())#读取一行 5 print (f.readline())#读取一行 6 print (f.tell()) 7 f.seek(0)#指针返回文件的初始位置 8 print (f.tell()) 9 print (f.readline())#读取一行 10 11 输出: 12 0 13 1234567890天长地久 14 15 ---叶倩文&林子祥--- 16 17 你是我一生最好的选择 18 19 86 20 0 21 1234567890天长地久
9,flush功能
1 #操作系统的缓存,会等待内存中的内容达到一定的程度才会写入硬盘,flush功能就是实时把缓存内容写入硬盘,不必等待缓存满逸''' 2 import sys,time 3 for i in range(20): 4 sys.stdout.write("#") 5 sys.stdout.flush() 6 time.sleep(0.1) 7 8 输出: 9 ###################每隔0.1秒输出一个#
10,清空文件内容
1 f=open("d:/aa.txt",'a',encoding="utf-8") 2 print(f.truncate(10))#从第10个字符开始清空文件,注意该方法不管指针在哪个位置 3 4 输出:
11,先读后追加的方法
1 f=open("d:/aa1.txt",'r+',encoding="utf-8")#读取+追加功能 2 print(f.readline()) 3 print(f.readline()) 4 print(f.readline()) 5 f.write("------------diao---------")#注意,不管此时光标在哪个位置,都只能追加在文件的结尾 6 print(f.readline()) 7 8 输出: 9 1234567------------diao---------
12,先写后读取的方法,毫无卵用
1 f=open("d:/aa1.txt",'w+',encoding="utf-8")#创建文件先写在读取功能,会覆盖原文件 2 f.write("------------diao---------\n") 3 f.write("------------diao---------\n") 4 f.write("------------diao---------\n") 5 f.write("------------diao---------\n") 6 print(f.tell()) 7 f.seek(10) 8 print(f.readline()) 9 f.write("should") 10 11 输出: 12 ------------diao--------- 13 ------------diao--------- 14 ------------diao--------- 15 ------------diao--------- 16 should
注意:不管光标在哪个位置,写都是在最后一行
13,二进制文件的操作
1 #二进制文件的读取 2 f=open("d:/aa1.txt",'rb')#w文件句柄,二进制文件,该方法用于读取网络传输的二进制文件(在python3开始网络传输都是用二进制的数据类型) 3 print(f.readline()) 4 print(f.readline()) 5 print(f.readline()) 6 7 输出: 8 b'11111111111111\r\n' 9 b'22222222222222\r\n' 10 b'33333333333333' 11 12 13 #二进制文件的写入 14 f=open("d:/aa1.txt",'wb')#w文件句柄,二进制文件,该方法用于写网络传输的二进制文件(在python3开始网络传输都是用二进制的数据类型) 15 f.write("kkkkkkkkk\n".encode("utf-8")) 16 f.close() 17 18 输出: 19 kkkkkkkkk
14,文件的修改
1 #真正的修改 2 f=open("d:/yesterday.txt","r",encoding="utf-8")#读取需要修改的源文件 3 f_new=open("d:/yesterday_new.txt","w",encoding="utf-8")#打开一个写入的文件 4 for line in f:#把源文件内容读取出来 5 if "肆意的快乐等我享受" in line: 6 line=line.replace("肆意的快乐等我享受","肆意的快乐等mike享受") 7 f_new.write(line) 8 f_new.close() 9 f.close() 10 11 输出: 12 修改成功
15,with,避免忘记关闭文件
1 with open("d:/yesterday.txt","r") as f,open("d:/yesterday_new.txt","w") as f_new: 2 for line in f: # 把源文件内容读取出来 3 if "有那么多肆意的快乐等我享受" in line: 4 line = line.replace("有那么多肆意的快乐等我享受", "有那么多肆意的快乐等mike享受") 5 f_new.write(line) 6 7 输出: 8 修改成功