文件的操作包含:读、写、修改

文件的多种操作:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
 1 # 读取文件的所有内容
 2 data = open("yesteday.txt", encoding="utf-8") .read()
 3 print(data)
 4 
 5 '''  f:文件句柄(包含这个文件的文件名,字符集,大小,在硬盘中的起始位置) '''
 6 
 7 # 'a'=append 追加
 8 f = open("yesteday2.txt", 'a', encoding="utf-8")
 9 f.write("qwerQWER1111\n") #在文件的结尾添加内容
10 f.close()
11 
12 # 'w'=write 写,覆盖之前的内容
13 f = open("yesteday2.txt", 'w', encoding="utf-8")
14 f.write("AAAADDDDD\n")
15 f.write("CCCCVVVVV\n")
16 f.close()
17 
18 #'r'=read 只读
19 f = open("yesteday2.txt", 'r', encoding="utf-8")
20 print(f.read())
21 f.close()
22 
23 # 'r+' = r+a  读和在末尾追加
24 f = open("yesteday.txt", 'r+', encoding='utf-8')
25 print(f.readline())
26 print(f.tell())
27 f.write("---nihao---\n")
28 print(f.readline()) #无输出结果是因为r+写操作是写在末尾,所以光标到了末尾,读不出来东西了
29 print(f.tell()) #tell按字符计数,返回光标的位置
30 f.seek(0) #返回到某个位置
31 print(f.read())
32 f.close()
33 
34 # 'w+' = w+r 写和读,写还是只能追加在文件最后
35 f = open("yesteday.txt", 'w+', encoding='utf-8')
36 print(f.readline()) #读不到内容,因为w+会新创建一个文件,将原文件的内容清空
37 f.write("---nihao---\n") #写操作是写在末尾,所以光标到了末尾,读不出来东西了
38 f.write("---oh,god---\n")
39 print(f.tell())
40 f.seek(3)
41 print(f.tell())
42 print(f.readline()) #当光标不在一行的开头时,readline读取的内容为光标之后的部分
43 print(f.tell())
44 f.write("写在第一行后面") #写操作是写在末尾,即使通过调整光标的位置,也无法将这行写到第一行后面
45 print(f.tell())
46 f.seek(0)
47 print(f.read())
48 f.close()
49 
50 # 'a+'追加读
51 f = open("yesteday.txt", 'a+', encoding='utf-8')
52 print(f.read()) #读不出内容来,因为a+默认光标在结尾
53 f.write("---nihao---\n")
54 print(f.tell()) #tell按字符计数,返回光标的位置
55 f.seek(0) #返回到某个位置
56 print(f.read())
57 f.close()
58 
59 # 'rb' = 以二进制格式读文件
60 f = open("yesteday.txt", 'rb') #不能加encoding的格式
61 print(f.read())
62 f.seek(0) #返回到某个位置
63 print(f.read())
64 f.seek(0) #返回到某个位置
65 print(f.read())
66 f.seek(0) #返回到某个位置
67 print(f.readline()) #readline读一行
68 f.close()
69 
70 # 'wb' = 以二进制格式写文件,会清空原文件内容
71 f = open("yesteday.txt", 'wb') #使用wb时写时需要将字符串变为二进制格式
72 f.write("hello binary\n".encode()) #将hello binary变为二进制格式后写入文件
73 f.write("hello binary\n".encode())
74 f.close()
75 
76 # 'ab' = 以二进制格式追加写文件
77 f = open("yesteday.txt", 'ab')
78 f.write("hello binary\n".encode())
79 f.close()

有关文件的其他方法:

 1 # f = open("yesteday2.txt", 'a+', encoding="utf-8")
 2 # print(f.tell()) #光标在文件最后
 3 # print(f.read(5)) #读取不到内容
 4 # print(f.tell()) #tell按字符计数
 5 # f.seek(3)  #返回到某个位置
 6 # print(f.readline()) #当seek回到某行的中间时,下次读取一行时将cut掉前面的部分,读取后面的
 7 # f.seek(3)
 8 # print(f.tell()) #获取文件读取到的位置
 9 # print(f.encoding) #返回文件句柄的编码格式
10 # print(f.fileno()) #返回编号--操作系统接口
11 # print(f.seekable()) #是否可以将光标移动回去,能返回True
12 # print(f.readable()) #判断文件是否可读
13 # print(f.writable()) #判断文件是否可写
14 # f.write("1111222333\n")
15 # f.write("1111222333\n") #写操作会先存在内存缓存区,不是直接写到硬盘,当缓存区达到一个数值时,同时写到硬盘里
16 # f.flush() # 强制刷新--将缓存区的内容写到硬盘
17 # f.truncate(10) #截断 ,从指定的位置截断后面的部分,如果不写默认从头开始截断,即清空,seek移动光标没
18 # f.close() #关闭打开的文件
19 # print(f.closed) #判断是否关闭了

有关文件读的示例:

 1 # 读五行
 2 f = open("yesteday2.txt", 'r', encoding="utf-8")
 3 for i in range(5):
 4     data = f.readline()
 5     print(data)
 6 f.close()
 7 
 8 # 读5个字符
 9 f = open("yesteday2.txt")
10 print(f.tell())
11 print(f.read(5))
12 f.close()
13 
14 # 打印除了第三行的其他内容
15 # enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
16 f = open("yesteday2.txt", 'r', encoding="utf-8")
17 for index,line in enumerate(f.readlines()):
18     if index == 3:
19         print("------")
20         continue
21     print(line.strip()) # strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
22 f.close()
23 
24 # 效率最高,读一行往内存里加一行,读下一行会把内存里的上一行覆盖掉
25 f = open("yesteday2.txt", 'r', encoding="utf-8")
26 count = 0
27 for line in f:
28     if count == 3:
29         count += 1
30         print("----------3-----------")
31         continue
32     print(line)
33     count += 1
34 f.close()

通过上面的放法,实际并不能完成文件的修改,因为写入文件总是写在文件最后或覆盖掉源文件

通过以下方式可修改文件内容:

>>> testfile.txt
就像一部电影原谅惨败的票房
我走在街上闷着头游荡把心事流放
关掉电话卸下行囊席地坐路旁
一如乞人不需要形象
万家灯火带领星光拼出个晚上
绚烂的欲望涌进了街巷每个虚弱地方
广场音箱兀自播放某个排行榜
上榜的歌像背景一样
那不是歌 那是孤单的歌
这白马非马的逻辑鲜有附和
唱着什么 故事里多少曲折
熙来攘往中几人识得几人识得
那不是歌 那是我写的歌
当时的我喜或悲已经记不得
南辕北辙 破坏热闹气氛的歌
几人识得几人识得
被人慌慌张张按掉了
 1 f = open("testfile", "r", encoding="utf-8")
 2 f_new = open("testfile2", "w", encoding="utf-8")
 3 
 4 for line in f:
 5     if "几人识得" in line:
 6         # '1'代表这一行只修改匹配的第一处
 7         line = line.replace("几人识得", "谁(shui)人识得", 1)
 8     f_new.write(line)
 9 f.close()
10 f_new.close()

为了防止进行完文件操作后,忘记关闭文件,可以使用with语法:

 1 #为了避免打开文件后忘记关闭,可以通过管理上下文,即
 2 with open("testfile", "r", encoding="utf-8") as f:
 3     for line in f:
 4         print(line)
 5 
 6 #如此方式,当with代码块执行完毕时,内部会自动关闭 并释放资源
 7 #在py2.7后,with又支持同时对多个文件的上下文进行管理,即
 8 with open("testfile", "r", encoding="utf-8") as f1,\
 9         open("testfile2", "w", encoding="utf-8") as f2:
10     print(f1.readline())
11     f2.writable()
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄