饮冰三年-人工智能-Python-15Python基础之文件处理
一、常用方法
# 写文件--开始 f=open('test','w',encoding="utf-8") #如果有则写,没有就创建 print(f.writable()) #True f.write('11111\n'); f.writelines(['22222\n','223333\n']); f.write('33333\n'); f.close(); # 写文件--结束 # 读取文件--开始 f=open('test',encoding="utf-8") # data=f.read(); # print(data); print(f.readable()) print(f.readline()) #一次读一行 print(f.readlines()) #一次所有行 f.close(); # 读取文件--结束 # 追加文件--开始 在光标处追加 f=open('test','r+',encoding="utf-8") print(f.writable()) #True f.write('一\n'); f.writelines(['二\n','223333\n']); f.write('三\n'); f.close(); # 追加文件--结束 # 追加文件--开始 在光标处追加 f=open('test','a',encoding="utf-8") print(f.writable()) #True f.write('在结尾追加\n'); f.writelines(['在结尾追加2\n','在结尾追加3\n']); f.close(); # 追加文件--结束 """输出结果 一 二 223333 三 3333 在结尾追加 在结尾追加2 在结尾追加3 """
# 文件处理b模式 #读取文件 f=open("test",'rb');# 注意,通过二进制代开文件不用指定编码 data = f.read().decode("utf-8");#但是读取的时候需要指定解码方式 print(data) f.close() #写入文件 f=open("test",'wb');# 注意,通过二进制代开文件不用指定编码 f.write("张三\n".encode("utf-8")) f.close(); #追加文件 f=open("test",'ab');# 注意,通过二进制代开文件不用指定编码 f.write("李四\n".encode("utf-8")) f.close();
# 读取文件最后一行 f=open("test",'rb');# 注意,通过二进制代开文件不用指定编码 for i in f: # 设置一个偏移量,offSet、 offset=-10; while True: # 通过seek(偏移量,2);的方式来倒着获取光标位置 f.seek(offset,2) # 从光标位置开始读取数据 data=f.readlines(); if len(data)>1: print(data[-1].decode('utf-8')); break; offset *=2
with open('test','r',encoding="utf-8") as a,open('test2','w',encoding="utf-8") as b: b.write(a.read())
二、总结
1:访问模式
最基本的操作是读w、写r、追加a。
b是表示以二进制方式读写,
+ 表示会一个查漏补缺,如果如果是r只读模式,r+就是变成读写模式
w | r | a | |
b | wb | rb | ab |
+ | w+ | r+ | a+ |
b+ | wb+ | rb+ | ab+ |
2:注意
-
- w模式,会把原来的内容删掉,然后再写入。慎用
-
r+模式,直接写入:文件指针将会放在文件的开头。先读后写:文件指针将会放在文件的末尾。
with open("r+有坑","w") as f: f.write("Hello,IO") ##此时文件内容为 Hello,IO # 直接使用r+的写功能 with open("r+有坑","r+") as f: f.write("Hi,r+") ##此时文件内容为 Hi,r+,IO #结论一:打开一个文件用于读写。文件指针将会放在文件的开头。 # 先读后写 with open("r+有坑","r+") as f: print(f.read(3)) #Hi, f.write("Hi,r+") ##此时文件内容为 Hi, r +, IOHi, r + # 结论二:如果进行了读取操作,文件指针将会放在文件的末尾
三、练习:文件的修改
古诗几首
作者:李白
题目《将进酒》
题目《早发白帝城》
作者:杜甫
题目《登高》
题目《兵车行》
#基本功能,实现对文件的增删改查 msg="""1:查询,2:新增 3:修改,4:删除""" #查询功能,根据输入的作者名称,查询该作者的作品 def query(author): print('查询作者是:\033[1;43m%s\033[0m' %author) query_data='作者:%s'%author query_Result=[] #记录查询结果 with open('古诗几首','r',encoding="utf-8") as read_f: tag=False for read_line in read_f: if read_line.strip()==query_data: tag = True continue elif read_line.strip()=="" and tag: tag = False break if tag: print(read_line,end="") query_Result.append(read_line) return query_Result def add(): print("这是新增功能") def dele(): print("这是删除功能") #这是修改功能 #格式:修改需要提供一个list集合,包含两块内容\ # data=[{'作者':'李白','内容':'题目《将进酒》'},{'作者':'李白','内容':'题目《静夜思》'}] #修改之前,先判断文件是否存在 def modify(data): #把拿到的data数据由字符串转换成列表 data=eval(data) #拿到作者名称,调用Query方法,返回list集合 article_list=query(data[0]["作者"]) if not article_list : print('输入的作者不存在') return "输入的作者不存在" else: # 遍历得到的list集合,然后如果看看题目是否存在 currentArticle= " "+data[0]["内容"]+"\n" if currentArticle not in article_list: print('输入的作品不存在') return '输入的作品不存在' else: #如果输入的作品存在 with open('古诗几首', 'r', encoding="utf-8") as read_f, \ open('古诗几首_新', 'w', encoding="utf-8") as write_f: # 遍历文件。如果不是当前行,直接复制,如果是当前行,复制修改后的 for curLine in read_f: if curLine.strip()!=currentArticle.strip(): write_f.write(curLine) else: currentArticlenew=" "+data[1]["内容"]+"\n" write_f.write(currentArticlenew) print("修改完成") dic_oper={'1':query,'2':add,'3':modify,'4':dele,} if __name__=='__main__': while True: print(msg) choice=input('请输入您的选项').strip() if not choice:continue if choice=="5":break data=input('请输入您的数据').strip() dic_oper[choice](data)