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")
posted @ 2019-10-11 19:30  不要找借口  阅读(111)  评论(0编辑  收藏  举报