• 文件处理二


    一、x模式(控制文件操作的模式) 了解

    x 只写模式(不可读;不存在则创建,存在则报错)

    # with open('c.txt',mode='x',encoding='utf-8') as f:
    #     f.read()
    

    二、控制文件读写内容的模式

    t:
    1、读写都是以字符串(unicode)为单位
    2、只能针对文本文件
    3、必须指定字符编码,即必须指定encoding参数
    b:binary模式
    1、读写都是以bytes为单位
    2、可以针对所有文件
    3、一定不能指定字符编码,即一定不能指定encoding参数

    总结:

    1、在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便

    2、针对非文本文件(如图片、视频、音频等)只能使用b模式

    # 错误演示:t模式只能读文本文件
    # with open(r'爱nmlgb的爱情.mp4',mode='rt') as f:
    #     f.read() # 硬盘的二进制读入内存-》t模式会将读入内存的内容进行decode解码操作
    
    with open(r'test.jpg',mode='rb') as f:
        res=f.read() # 硬盘的二进制读入内存—>b模式下,不做任何转换,直接读入内存
        print(res) # bytes类型—》当成二进制
        print(type(res))
    
    # 文件拷贝工具
    # src_file=input('源文件路径>>: ').strip()
    # dst_file=input('源文件路径>>: ').strip()
    # with open(r'{}'.format(src_file),mode='rb') as f1,
    #     open(r'{}'.format(dst_file),mode='wb') as f2:
    #     # res=f1.read() # 内存占用过大
    #     # f2.write(res)
    #
    #     for line in f1:
    #         f2.write(line)
    

    循环读取文件

    方式一、自己控制每次读取的数据的数据量

    # with open(r'test.jpg',mode='rb') as f:
    #     while True:
    #         res=f.read(1024) # 1024
    #         if len(res) == 0:
    #             break
    #         print(len(res))
    

    方式二、以行为单位读,当一行内容过长时会导致一次性读入内容的数据量过大

    # with open(r'g.txt',mode='rt',encoding='utf-8') as f:
    #     for line in f:
    #         print(len(line),line)
    
    # with open(r'g.txt',mode='rb') as f:
    #     for line in f:
    #         print(line)
    

    三、文件操作的其他方法

    1读相关操作

    1.1 readline:一次读一行

    with open(r'g.txt',mode='rt',encoding='utf-8') as f:
        res1=f.readline()
        res2=f.readline()
        print(res2)
    

    1.2 readlines:把文件内容一次读取存放入列表

    with open(r'g.txt',mode='rt',encoding='utf-8') as f:
        res=f.readlines()
        print(res)
        ['111
    ', '222
    ', '333
    ', '444
    ', '5555']
    

    强调:f.read()与f.readlines()都是将内容一次性读入内存,如果内容过大会导致内存溢出

    2写相关操作

    writelines()把列表或字符串一次写入,不能输入纯数字

    with open('h.txt',mode='wt',encoding='utf-8') as f:
        f.write('1111
    222
    3333
    ')
        # l=['11111
    ','2222','3333',4444]#错误的
        f.writelines(l)
        
        
            # 补充1:如果是纯英文字符,可以直接加前缀b得到bytes类型
        # l = [
        #     b'1111aaa1
    ',
        #     b'222bb2',
        #     b'33eee33'
        # ]
    
        # 补充2:'上'.encode('utf-8') 等同于bytes('上',encoding='utf-8')
        l = [
            bytes('上啊',encoding='utf-8'),
            bytes('冲呀',encoding='utf-8'),
            bytes('小垃圾们',encoding='utf-8'),
        ]
        f.writelines(l)
        
        
    

    3.flush:将文件立即写入硬盘

    # with open('h.txt', mode='wt',encoding='utf-8') as f:
    #     f.write('哈')
    #     f.flush()
    

    4.了解

    # with open('h.txt', mode='wt',encoding='utf-8') as f:
    #     print(f.readable())
    #     print(f.writable())
    #     print(f.encoding)
    #     print(f.name)
    #
    # print(f.closed)
    False
    True
    utf-8
    h.txt
    True
    

    四、指针移动

    ​ 指针动的单位都是以bytes/字节为单位,只有一种情况特殊, t模式下的read(n),n代表的是字符个数

    # with open('aaa.txt',mode='rt',encoding='utf-8') as f:
    #     res=f.read(4)
    #     print(res)
    

    f.seek(n,模式)n代表的是移动的字节数

    f.tell 输出当前指针位置

    模式0:参照物是文件开头位置

    with open('aaa.txt',mode='rb') as f:
        f.seek(9,0) 
        f.seek(3,0) # 3
    

    模式1:参照物是当前指针所在位置

    with open('aaa.txt',mode='rb') as f:
        f.seek(9,1)
        f.seek(3,1) # 12
    

    模式2:参照物是文件末尾位置,应该倒着移动

    with open('aaa.txt',mode='rb') as f:
        f.seek(-9,2)
        print(f.tell()) #0
        f.seek(-3,2)
        print(f.tell()) #6
    

    f.seek()应用:监测文件

    import time
    with open('access.log', mode='rb') as f:
        # 1、将指针跳到文件末尾
        # f.read() # 错误
        f.seek(0,2)
    
        while True:
            line=f.readline()
            if len(line) == 0:
                time.sleep(0.3)
            else:
                print(line.decode('utf-8'),end='')
                
    with open('access.log', mode='at', encoding='utf-8') as f:
        f.write('20200311111112 yyy转账200w
    ')   写入文件,第一份代码不断的读出                
    

    五、文件修改的两种方式

    方式一、文本编辑采用的就是这种方式

    实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件

    优点: 在文件修改过程中同一份数据只有一份

    缺点: 会过多地占用内存

    # with open('c.txt',mode='rt',encoding='utf-8') as f:
    #     res=f.read()
    #     data=res.replace('alex','dsb')
    #     print(data)
    #
    # with open('c.txt',mode='wt',encoding='utf-8') as f1:
    #     f1.write(data)
    

    方式二、

    实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名

    优点: 不会占用过多的内存

    缺点: 在文件修改过程中同一份数据存了两份

    import os
    with open('c.txt', mode='rt', encoding='utf-8') as f, 
            open('.c.txt.swap', mode='wt', encoding='utf-8') as f1:
        for line in f:
            f1.write(line.replace('alex', 'dsb'))
    
    os.remove('c.txt')
    os.rename('.c.txt.swap', 'c.txt')
    
  • 相关阅读:
    python setup.py install 失败
    Python xlsx 读取
    Java ArrayList Sort
    java console ( mac osx ) 命令行编码
    Lucene Query Term Weighting
    Fast Intro To Java Programming (2)
    随感 20150512
    循环数组中找查找某个数值
    数字内组合得到下一个比该数大的数
    android activity空指针异常解决问题解决
  • 原文地址:https://www.cnblogs.com/chenyoupan/p/12506269.html
Copyright © 2020-2023  润新知