饮冰三年-人工智能-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
"""
文件处理1
# 文件处理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 +
      # 结论二:如果进行了读取操作,文件指针将会放在文件的末尾
      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)
文件处理

 

posted @ 2018-09-30 14:48  逍遥小天狼  阅读(405)  评论(0编辑  收藏  举报