• 关于操作文件


    打开方式

    方式一:

      f = open()
    
       参数常用对应位置  文件地址   mode=相关模式   打开的编码格式encoding=
    
      最后一定要
    
      f.close
    
      在对文件进行关闭后对f的相关操作都会无效化

    方式二:

      with open() as f:    和f=open相比省略了f.close()
    
       参数常用对应位置  文件地址   mode=相关模式   打开的编码格式encoding=
    
      这边的文件位置 考虑到字符串转义问题  需要 \ 或者直接在字符串之前加 r
    
              如果当前打开文件和执行文件在一个文件夹(不包括子文件夹) 可以以相对位置直接文件名打开

    操作方法

    .read()  读取打开文件的内容 可以跟位置参数 读取对应的是几个单位 比如t模式读取一个文字单位 ,b模式读取一个字节单位
    
    .write()  写入文件的内容,后面参数为写入文件内容
    
    .writeable()  判断是否可写 返回值True False
    
    .readable()  判断是否可读 返回值True False
    
    .readlines()  读取所有的行的内容 最后换回形式为一个字典 列入 ['jinpan','python','play']
    
    .readline()  读取文件的一行内容,通常用于for循环中循环读取
    
    .writelines()  writelines(list)为写入方式,函数writelines可以将list写入到文件中,但是不会在list每个元素后加换行符,所以如果想每行都有换行符的话需要自己再加上。

    .
    truncate()  跟截断的字节数  保留文件对象截断字节数量的
    .tell()  查看光标移动了多少位 bytes

    .flush()  将内存中的文件内容直接刷到硬盘
    .seek()  offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
      
          whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
    
    

    文件的操作模式

    默认的文件模式都为t模式 t为文本模式,该模式中字符串为一个单位,字母数字也属于一个单位
    
    r 
    
    以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    
    个人理解:为读取模式该模式下读取的为文本模式的相关内容  若文件读取时候文件不存在会报错
    
    rb
    
    以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    
    个人理解:为二进制字节的读取模式 该模式下读取的为字节(bytes)模式下的相关内容,在这模式里比如编码格式为utf8,那么一个文字对应3个字节,1个字母对应1个字节
    
    w
    
    打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    
    个人理解:为文本的写入模式 不过为覆盖写入 
    
    wb
    
    以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    
    个人理解:为二进制的写入模式 不过为覆盖写入  通常用于储存二进制文件:照片视频
    
    a
    
    打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    
    个人理解:追加文本模式 在文本末尾添加内容
    
    ab
    
    以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    
    个人理解:追加二进制字节写入模式  在文本末尾添加
    
    r+
    
    打开一个文件用于读写。文件指针将会放在文件的开头。
    
    个人理解:可读可写文本  不过该模式会覆盖相关的原位置内容,写入起始点在文件开头
    
    rb+
    
    以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    
    个人理解:可读可写bytes  不过该模式会覆盖相关的原位置内容,写入起始点在文件开头
    
    w+
    
    打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    
    个人理解:可读可写文本  该模式会在with open 环节就 直接清空文件内容然后写入新内容
    
    wb+
    
    以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    
    个人理解:可读可写二进制  该模式会在with open 环节就 直接清空文件内容然后写入新内容
    a+  对应a 它可读
    打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    
    ab+
    
    以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

    操作文件的一些疑难困惑点:

    对于t模式下一个文字1个单位 b模式下3个bytes  read() 读取时候要根据相关的模式进行判断读取数量 否则报错

    文件模式处于 b模式时候不需要encoding的参数

    seek() 和 read()  方法搭配使用的时候需要注意seek的偏移单位始终是字节 seek偏移单位也可以取负值 0为开头位置 1为指针当前位置 2为结尾位置

             不合理的指针偏移和修改会导致文章乱码

    read()  b模式读取相关单位 (也和光标位置有关系)读取单位量 不符合当前格式规范 会报错

        

    操作文件的一些实例:

    实时监测文件动态

    监测文件内容(Ps:使用时候要注意,要先运行监测文件内容代码后再进行修改文件代码)

    with open(r'test01.txt','rb') as f:
        # 先将光标移动到文件末尾
        f.seek(0,2)
        while True:
            res = f.readline()
            # 查看光标移动了多少位 bytes
            # print(f.tell())
            if res:
                print("新增的文件内容:%s"%res.decode('utf-8'))
                # 说明有人操作当前文件
            # else:
            #     # 说明文件没有被任何人操作
            #     print('暂无其他人操作该文件')

    修改文件内容

    import time
    res = time.strftime('%Y-%m-%d %X')
    # print(res,type(res))
    #
    with open(r'test01.txt','a',encoding='utf-8') as f:
        f.write('%s egon给jason发了1个亿的工资
    '%res)

    截断案例:

    with open(r'test','a',encoding='utf-8') as f:
        f.truncate(6)  # 接收的字节的长度 整型
        # 保留0~6字节数 后面的全部删除(截断)

    修改文件:(各有优点)

    方法1

    # 修改文件
    # 先将数据由硬盘读到内存(读文件)
    # 在内存中完成修改(字符串的替换)
    # 再覆盖原来的内容(写文件)
    # with open(r'test02.txt','r',encoding='utf-8') as f:
    #     data = f.read()
    #     print(data)
    #     print(type(data))
    #
    # with open(r'test02.txt','w',encoding='utf-8') as f:
    #     res = data.replace('egon','jason')
    #     print(data)
    #     f.write(res)
    
    """
    优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间
    缺点:当文件过大的情况下,可能会造成内存溢出
    """

    方法2

    # 创建一个新文件
    # 循环读取老文件内容到内存进行修改  将修改好的内容写到新文件中
    # 将老文件删除  将新文件的名字改成老文件名
    import os
    
    
    with open(r'test02.txt','r',encoding='utf-8') as read_f,
            open(r'test02.swap','a',encoding='utf-8') as write_f:
        for line in read_f:
            new_line = line.replace('jason','egon')
            write_f.write(new_line)
    os.remove('test02.txt')
    os.rename('test02.swap','test02.txt')
    
    
    """
    优点:内存中始终只有一行内容 不占内存
    缺点:再某一时刻硬盘上会同时存在两个文件
    
    
    
    每日默写
        修改文件的两种方式
        加上你自己的逻辑思维
    """
  • 相关阅读:
    Neurosurgeon: Collaborative Intelligence Between the Cloud and Mobile Edge
    Adversarial Attack Type I: Cheat Classifiers by Significant Changes
    Federated Optimization for Heterogeneous Networks
    On the Convergence of FedAvg on Non-IID Data
    联邦学习综述
    Federated Learning: Challenges, Methods, and Future Directions
    Hop: Heterogeneity-aware Decentralized Training
    C++文件操作
    c++: internal compiler error: Killed (program cc1plus)
    SCAFFOLD: Stochastic Controlled Averaging for On-Device Federated Learning
  • 原文地址:https://www.cnblogs.com/jinpan/p/11152061.html
Copyright © 2020-2023  润新知