文件操作分为读、写、修改,我们先从读开始
f = open(file = 'D:/工作日常/ABCD.txt',mode = 'r',encoding = 'utf-8') #file 是文件路径 mode = 'r' 是只读模式,encoding是文件使用的编码 f = open(file ='D:/工作日常/ABCD.txt',mode = 'rb') #读出来是二进制格式,只是给机器看,用于网络传输 data = f.read() f.close
智能监测编码
原理:gbk两个字节表示一个字符,utf-8三个字节表示一个字符。所以,一段拥有十个字节的编码不可能是utf-8。
import chardet #需要从第三方工具箱单独安装 f = open('log', mode='rb') data = f.read() f.close() result = chardet.detect(open('log', mode = 'rb').read()) print(result)
写模式操作文件
f = open('Mary.text', 'r', encoding = 'gbk') for line in f: #一次取一行 print(line) #print本身自带换行,所以输出结果在每两行之间会多一行空行 f.close()
写文件 w:创建,会清空之前文件的所有内容
f = open(file='D:\电视剧.txt',mode='w',encoding='gbk') #创建一个新文件,写入 f.write('倾城之恋') f.close()
f = open('电视剧2.txt','wb') #在pycharm的目录下,创建一个新文件,写入 f.write('倾城之恋'.encode('gbk')) #写入之后,需要用’gbk‘编码才能打开 f.close()
f = open('电视剧2.txt','wb') f.write('蓝色生死恋'.encode('gbk')) #清空原来的重新输入 f.close()
追加模式操作文件 a
f = open('电视剧.txt','a',encoding='gbk') #在原文件内容后进行添加 f.write('\t蓝色生死恋') f.close()
混合操作文件
f = open('电视剧.txt','r+',encoding='gbk') #读写模式,相当于以读的方式打开,支持追加内容 data = f.read() #可以读内容 print(data) #print("content",data) f.write(' 何以笙箫默') #可以写 f.write("\n new line") 此时光标移动到了最后,无可读内容 print(f.read()) #print("new content",f.read()) 故,print为空 f.close()
f = open('电视剧.txt','w+',encoding='gbk') #写读模式,相当于以创建的方式打开文件 data = f.read() #可以读内容 print(data) #print("content",data) f.write(' 何以笙箫默') #可以写 f.write("\n new line") 文件里只有新写的内容,原内容已被清空 print(f.read()) #print("new content",f.read()) f.close()AAAF
文件操作的其他方法
def fileno(self,*args,**kwargs): # real signature unknown #返回文件句柄在内核中的索引值,以后做I0多路复用(网络编程)时可以用到
def flush(self,*args,**kwargs): # real signature unknown #把文件从内存buffer里强制刷新到硬盘
f = open('电视剧.txt','w') f.write('花间提壶方大厨') f.flush() #避免了因临时断电而产生已打印出的文字消失的情况
def readable(self,*args,**kwargs): # real signature unknown #判断是否可读 linux里一切皆文件,即使是网卡驱动也是文件,但网卡驱动不可读,一般用不到。'w'也不可读 def readline(self,*args,**kwargs): # real signature unknown #只读一行,遇到 \r or \n 为止 def seek(self,*args,**kwargs): # real signature unknown #把操作的光标移到指定位置 #*注意seek的长度是按字节算的,字符编码存每个字符所占的字节长度不一样 #如“路飞学城”用gbk存是2个字节一个字,用utf-8是3个字节一个字, #因此,以gbk打开时,seek(4)就会把光标切换到第四个字节之后的位置,但如果是utf-8,seek(4)会导致,拿到了“飞”这个字的一部分字节,打印的话会报错,
#因为处理剩下的文本时发现用这个会出错
f.seek(0) #返回文件开头
def seekable(self,*args,**kwargs): # real signature unknown #判断文件是否可进行seek操作 linux上一切皆文件,终端也是文件,但是不能进行seek操作 def tell(self,*args,**kwargs): # real signature unknown #返回当前文件操作光标的位置 def truncate(self,*args,**kwargs): # real signature unknown #按指定长度截断文件 #*指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全部去掉
f.truncate(n) #从文件开头开始截取长度为n的部分
def writable(self,*args,**kwargs): # real signature unknown #判断文件是否可写
tell和seek找的是字节,read找的是字符
文件修改操作
f = open("电视剧.txt", 'r+', encoding = 'gbk') #只能覆盖,不能后移 f.seek(6) f.write("[路飞学城 luffycity]") #因为英文字符占位和中文不一样,可能会出现乱码 f.close()
多数电脑修改文件都是把文件从硬盘提到内存,这样面临的问题就是,内存如果不够大,文件就无法完全修改,同时,如果突然断电,会失去所有修改信息。
还有一种占硬盘的修改方式是,在硬盘里创建一个新文件,从原文件里提取出一条一条的信息,检测是否需要修改,如果需要就修改后放到新文件里,不需要就直接放到新文件里。
import os f_name = '电视剧.txt' f_new_name = '%s.new'%f_name old_str = '蓝色' new_str = '蓝色生死恋' f = open(f_name,'r',encoding='gbk') f_new = open(f_new_name,'w',encoding='gbk') for line in f: if old_str in line: line = line.replace(old_str,new_str) f_new.write(line) f.close() f_new.close() os.rename(f_new_name,f_name)