Python--文件操作(操作文件)
文件的操作包含:读、写、修改
文件的多种操作:
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()