• 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("
    撒娇的黄金客户")
    f.close()
    

    五、读写模式(r+, r+b)

    f = open("测试",mode='r+',encoding='utf-8') #常用
    data = f.read() #可以读内容
    print(data)
    f.write("
    撒娇的黄金客户") #可以写
    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("
    撒娇的黄金客户")
    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
        只读一行,遇到
     or 
    为止
    
    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")
    
  • 相关阅读:
    用Lua编写ACM算法竞赛开灯问题
    糟糕的中文版龙书
    font and face, 浅探Emacs字体选择机制及部分记录
    栈与卡特兰数
    关于2018年东南大学Robomaster算法组工作的总结
    C++中的默认参数规则
    MySQL第三章——嵌套查询
    MySQL第三章——空值的处理
    MySQL第三章——数据更新
    MySQL第三章——连接查询
  • 原文地址:https://www.cnblogs.com/shibojie/p/11656345.html
Copyright © 2020-2023  润新知