给你一个文件 “联系方式.txt”,如何查看内容?
1.安装文本编辑器软件
2.利用文本编辑器软件打开
3.查看 or 写入
4.保存,关闭
文件操作分为读、写、修改、我们先从读开始学习
f = open(file="E:/鲁佳/python/联系方式.txt",mode ='r',encoding = 'gbk') data = f.read() f.close
文件处理——二进制模式 (视频、图片、进行网络传输的文本 用rb模式)
f = open(file="E:/鲁佳/python/联系方式.txt",mode ='rb') data = f.read() f.close print(data)
文件处理——智能检测编码的工具
问:示例2和示例1的区别在哪?
答:在于示例2打开文件时并未指定encoding,这是为何?是因为直接以rb模式打开了文件,rb是指二进制模式,数据读到内存里直接是bytes格式,如果想看内容,还需要手动decode,因此在文件打开阶段,不需要制定编码
问:假如你不知道你要处理的文件是什么编码怎么办呢?
首先安装第三方工具包 chardet
E:\鲁佳\python>pip install chardet
import chardet f = open(file="E:/鲁佳/python/联系方式.txt",mode ='rb') data = f.read() f.close result = chardet.detect(data) print(result)
循环文件:
f = open('联系方式.txt',mode = 'r', encoding = 'gbk') for line in f: print(line) f.close()
结果:(注意:结果之间有空行,print会自动加一个空行)
张瑶 18456898767
王芳 13569876898
杨超 11345566778
文件处理——写模式操作文件, w 不是修改是创建模式, 如果在已有文件上用w,会清空原来的内容
f = open('联系方式.txt',mode = 'w', encoding = 'gbk') f.write('星星\t18909890988') f.close()
文件处理——追加模式操作文件(把内容追加到文件尾部)
f = open('联系方式.txt',mode = 'a', encoding = 'gbk') f.write('\n东来\t18789007657\n') f.write('天天\t18982564562\n') f.write('杨英\t13658479875\n') f.close()
注意:
- 文件操作时,以'a'或'ab'模式打开,则只能追加,即:在原来内容的尾部追加内容
- 写入到硬盘上时,必须是某种编码的0101010,打开时需要注意:
- ab,写入时需要直接传入以某种编码的0101010,即字节类型
- a 和 encoding,写入时需要传入encoding字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的二进制形式
文件处理——混合操作文件
读写混合模式
f = open('联系方式.txt',mode = 'r+', encoding = 'gbk') data = f.read() print(data) f.write('白云\t18789007657\n') f.write('李文\t18982564562\n') f.write('杨轻\t13658479875\n') f.close()
文件处理——文件操作其他功能
def fileno(self,*args,**kwargs): #返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到 def flush(self,*args,**kwargs): #把文件从内存buffer里强制刷新到硬盘 def readable(self,*args,**kwargs): #判断是否可读 def readline(self,*args,**kwargs): #只读一行,遇到\r or \n为止 def seek(self,*args,**kwargs): #把操作文件的光标移到指定位置 #注意seek的长度是按字节算的,字符编码存每个字符所占的字节长度不一样 #如"路飞学成"用gbk存是2个字节一个字,用utf-8就是3个字节 def seekable(self,*args,**kwargs): #判断文件是否可进行seek操作 def tell(self,*args,**kwargs): #返回当前文件操作光标位置 def truncate(self,*args,**kwargs): #按指定长度截断文件,指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全部去掉 def writable(self,*args,**kwargs): #判断文件是否可写
文件处理——文件修改功能
一、修改原文件方式
1 def alter(file,old_str,new_str): 2 """ 3 替换文件中的字符串 4 :param file:文件名 5 :param old_str:就字符串 6 :param new_str:新字符串 7 :return: 8 """ 9 file_data = "" 10 with open(file, "r", encoding="utf-8") as f: 11 for line in f: 12 if old_str in line: 13 line = line.replace(old_str,new_str) 14 file_data += line 15 with open(file,"w",encoding="utf-8") as f: 16 f.write(file_data) 17 18 alter("file1", "09876", "python")
二、把原文件内容和要修改的内容写到新文件中进行存储的方式
2.1 python字符串替换的方法,修改文件内容
import os def alter(file,old_str,new_str): """ 将替换的字符串写到一个新的文件中,然后将原文件删除,新文件改为原来文件的名字 :param file: 文件路径 :param old_str: 需要替换的字符串 :param new_str: 替换的字符串 :return: None """ with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2: for line in f1: if old_str in line: line = line.replace(old_str, new_str) f2.write(line) os.remove(file) os.rename("%s.bak" % file, file) alter("file1", "python", "测试")
2.2 python 使用正则表达式 替换文件内容 re.sub 方法替换
1 import re,os 2 def alter(file,old_str,new_str): 3 4 with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2: 5 for line in f1: 6 f2.write(re.sub(old_str,new_str,line)) 7 os.remove(file) 8 os.rename("%s.bak" % file, file) 9 alter("file1", "admin", "password")