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行

 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 。。。
打印文件内容,跳过第9行

注意:上面的方法把文件内容一次性读取到内存,可能导致性能问题,因此是一种low的方法

聪明的做法是读取一行,打印一行,放弃一行,内存里只保留当前有效的一行

 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,文件指针操作

 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 修改成功

 

posted on 2017-11-24 10:17  敏少爷  阅读(153)  评论(0编辑  收藏  举报

导航