14 文件操作
一、初识文件操作
使用python来读写文件是非常简单的操作. 我们使用open()函数来打开一个文件, 获取到文件句柄. 然后通过文件句句柄就可以进行行各种各样的操作了. 根据打开方式的不同能够执行的操作也会有相应的差异.
打开文件的方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b
二、读模式(r,rb)
r 模式:
f = open('test_r',mode='r',encoding='utf-8')
data = f.read()
#for line in f: #循环文件
#print(line)
print(data)
f.close
注意:encoding表示编码集,文件实际保存编码就用实际编码获取数据,一般都用utf-8
如果不知道编码是什么?就可以用rb模式打开
rb 模式:
import chardet
f = open('test_rb',mode='rb')
data = f.read()
print(data) #data是字节码
f.close()
result = chardet.detect(data) #判断文件是什么编码
print(result) #{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
res = data.decode("utf-8") #解码
print(res)
三、循环文件(w,wb)
w 模式:
f = open("test_w",mode='w',encoding='utf-8')
f.write("测试写文件")
f.close()
注意:如果文件不存在,会创建新文件;如果文件存在,会清空文件中的内容
wb 模式:
f = open("test_wb",mode='wb')
f.write("测试二进制".encode("utf-8"))
#写文件是必须将字符串转化成utf-8,如果不指定写入的是字节类型编码
f.close()
四、追加(a,ab)
a 模式:
把内容追加到文件尾部
f = open("test_a",mode='a',encoding='utf-8')
f.write("\n撒娇的黄金客户")
f.close()
五、读写模式(r+, r+b)
f = open("测试",mode='r+',encoding='utf-8') #常用
data = f.read() #可以读内容
print(data)
f.write("\n撒娇的黄金客户") #可以写
f.close()
六、写读模式(w+,w+b)
f = open("test_w+",mode='w+',encoding='utf-8') #不经常用
f.write("撒娇的黄金客户")
data = f.read()
print(data)
f.close()
七、追加读(a+)
f = open("test_a+",mode='a+',encoding='utf-8')
# f.seek(0)
# data = f.read()
# print(data)
f.write("\n撒娇的黄金客户")
f.seek(0)
data = f.read()
print(data)
f.close()
八、文件操作的其他内容
def fileno(self, *args, **kwargs): # real signature unknown
返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到
def flush(self, *args, **kwargs): # real signature unknown
把文件从内存buffer里强制刷新到硬盘
def readable(self, *args, **kwargs): # real signature unknown
判断是否可读
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) 就把光标切换到了“飞”和“学”两个字中间。
但如果是utf8,seek(4)会导致,拿到了飞这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用utf8处理不了了,因为编码对不上了。少了一个字节
def seekable(self, *args, **kwargs): # real signature unknown
判断文件是否可进行seek操作
def tell(self, *args, **kwargs): # real signature unknown
返回当前文件操作光标位置
def truncate(self, *args, **kwargs): # real signature unknown
按指定长度截断文件
*指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。
def writable(self, *args, **kwargs): # real signature unknown
判断文件是否可写
九、文件修改
import os
with open("食物","r",encoding="utf-8") as f1,open("食物_new","w",encoding="utf-8") as f2:
content = f1.read()
new_content = content.replace("菜","花")
f2.write(new_content)
os.remove("食物")
os.rename("食物_new","食物")
import os
with open("食物2","r",encoding="utf-8") as f1,open("食物2_new","w",encoding="utf-8") as f2:
for line in f1:
new_line = line.replace("花","肉")
print(new_line)
f2.write(new_line)
os.remove("食物2")
os.rename("食物2_new","食物2")