zoukankan      html  css  js  c++  java
  • 文件处理补充

    文件处理除了处理txt文件类型还有b模式等

    T模式下

    '''
      1、读写都以字符串(unicode)为单位
      2、只能针对文本文件
      3、必须指定encoding字符编码
    '''
    # 1、r(默认的操作模式):只读模式,当文件不存在时报错,当文件存在时文件指针跳到开始位置
    with open('r.txt', mode='rt', encoding='utf-8') as f:
        print('第一次读'.center(50,'*'))
        res = f.read() # 把所有内容从硬盘读入内存
        print(res)
    
        print('第二次读'.center(50,'*'))
        res1 = f.read() # 把所有内容从硬盘读入内存
        print(res1)
    
    # 2、w:只写模式,当文件不存在时会创建空文件,当文件存在时会清空文件,指针位于开始位置
    '''
    强调1:
    强调2:如果重新以w模式打开文件,则会清空文件内容
    '''
    with open('w.txt', mode='wt', encoding='utf-8') as f:
        f.write('哈哈哈
    ')
        f.write('哈哈哈
    ')
        f.write('哈哈哈
    ')
    
    # 3、a:只追加写,在文件不存在时会创建空文档,在文件存在时文件指针会直接跳到末尾
    with open('w.txt', mode='at', encoding='utf-8') as f:
        f.write('哈哈哈
    ')
        f.write('哈哈哈
    ')
        f.write('哈哈哈
    ')
    
    '''
    强调w模式与a模式的异同:
    相同点:再打开的文件不关闭的情况下,连续的写入,新内容总会跟在前写的内容之后
    不同点:以a模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾
    '''   
    

      

    B模式下

    硬盘的二进制读入内存 --> t模式会将读入内存的内容进行decode解码

    with open(r'再也不相信爱情.rmvb',mode='rt') as f:
        f.read()    # 硬盘的二进制读入内存 --> t模式会将读入内存的内容进行decode解码
    

     硬盘的二进制读入内存 --> b模式下,不做任何转换,直接读入内存,读进去什么出来什么就是什么

    with open(r'再也不相信爱情.rmvb',mode='rb') as f:
        res = f.read()    # 硬盘的二进制读入内存 --> b模式下,不做任何转换,直接读入内存
        print(res)      # bytes类型--》当成二进制
        
    # OverflowError: bytes object is too large to make repr
    # 溢出错误:bytes对象太大,无法生成repr
    

      它们两者之间的区别

    # b: 读写都是以二进制位单位,不能指定字符编码,即不能指定encoding参数
     with open('222.mp4',mode='rb') as f:
         data=f.read()
         print(type(data)) # 输出结果为:<class 'bytes'>
    
     with open('a.txt',mode='wb') as f:
         msg="你好"
         res=msg.encode('utf-8') # res为bytes类型
         f.write(res) # 在b模式下写入文件的只能是bytes类型
    
    #强调:b模式对比t模式
    1、在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便
    2、针对非文本文件(如图片、视频、音频等)只能使用b模式
    
    

      

    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)
    

      

    B做的视频,图片,最好少用for,多用while。

    • 文件操作
    # 读操作
    f.read()  # 读取所有内容,执行完该操作后,文件指针会移动到文件末尾
    f.readline()  # 读取一行内容,光标移动到第二行首部
    f.readlines()  # 读取每一行内容,存放于列表中
    
    # 强调:
    # f.read()与f.readlines()都是将内容一次性读入内容,如果内容过大会导致内存溢出,若还想将内容全读入内存,则必须分多次读入,有两种实现方式:
    # 方式一
    with open('a.txt',mode='rt',encoding='utf-8') as f:
        for line in f:
            print(line) # 同一时刻只读入一行内容到内存中
    
    # 方式二
    with open('1.mp4',mode='rb') as f:
        while True:
            data=f.read(1024) # 同一时刻只读入1024个Bytes到内存中
            if len(data) == 0:
                break
            print(data)
    
    

      

    写操作:f.write('1111
    222
    ') # 针对文本模式的写,需要自己写换行
    with open('h.txt',mode='wt',encoding='utf-8') as f:
        # f.write('1111
    222
    3333
    ')
    
        # l=['11111
    ','2222','3333',4444]
        l=['11111
    ','2222','3333']
        # for line in l:
        #     f.write(line)
        f.writelines(l)
    

      

    f.write('1111
    222
    '.encode('utf-8')) # 针对b模式的写,需要自己写换行符
    with open('h.txt',mode='wt',encoding='utf-8') as f:
        l = ['111
    ','222
    ','333',444]
        for line in l:
            f.write(line
    

      

    with open('h.txt', mode='wb') as f:
        l = [
            '1111aaa1
    '.encode('utf-8'),
            '222bb2'.encode('utf-8'),
            '33eee33'.encode('utf-8')
        ]
    
    with open('h.txt', mode='wb') as f:#纯英文要在前面加b
        l = [
            b'1111aaa1
    ',
            b'222bb2',
            b'33eee33'
        ]
    
                 #'上'.encode('utf-8') 等同于bytes('上',encoding='utf-8')
    with open('h.txt', mode='wb') as f:
        l = [
            bytes('上啊',encoding='utf-8'),
            bytes('冲呀',encoding='utf-8'),
            bytes('小垃圾们',encoding='utf-8'),
        ]
    

      

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

      了解性质

    with open(r'test.txt', 'wt', encoding='utf-8') as f:
        print(f.readable())  # 文件是否可读
        print(f.writable())  # 文件是否可写
        print(f.closed)      # 文件是否关闭
        print(f.encoding)    # 如果文件打开模式为b,则没有该属性
        print(f.flush())     # 立刻将文件内容从内存刷到硬盘
        print(f.name)        # 获取文件名
    

      控制指针移动

    #前提:文件内指针的移动都是Bytes为单位的,唯一例外的是t模式下的read(n),n以字符为单位
    with open('a.txt',mode='rt',encoding='utf-8') as f:
         data=f.read(3) # 读取3个字符
    
    
    with open('a.txt',mode='rb') as f:
         data=f.read(3) # 读取3个Bytes
    
    
    # 之前文件内指针的移动都是由读/写操作而被动触发的,若想读取文件某一特定位置的数据,则则需要用f.seek方法主动控制文件内指针的移动,详细用法如下:
    # f.seek(指针移动的字节数,模式控制): 
    # 模式控制:
    # 0: 默认的模式,参照物是文件开头位置
    # 1: 参照物是当前指针所在位置
    # 2: 参照物是文件末尾位置,应该倒着移动
    # 强调:只有0模式可以在t下使用,1、2必须在b模式下使用
    

      

    #零的案例
    with open('test.txt',mode='rb') as f:
        f.seek(9,0) # 9
        f.seek(3,0) # 3
        # print(f.tell())
        f.seek(4,0) # 4
        res=f.read()
        print(res.decode('utf-8'))
    

      

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

      

    #2
    with open('test.txt',mode='rb') as f:
        f.seek(-9,2)
        # print(f.tell())
        f.seek(-3,2)
        # print(f.tell())
        print(f.read().decode('utf-8'))
    

      

     

  • 相关阅读:
    js设置、修改、获取、删除 cookie
    mysql排序让空值NULL排在数字后边
    javascript的函数作用域及声明提前
    修改mysql的密码
    解决thinkphp设置session周期无效的问题
    filter_var() 验证邮箱、ip、url的格式 php
    将中文字符串分割为数组 解决str_split中文乱码php
    生成多个不重复的随机数字php
    javascript控制input只允许输入数字
    推荐开发工具系列之--Clover(文件浏览器)
  • 原文地址:https://www.cnblogs.com/Tornadoes-Destroy-Parking-Lots/p/12506370.html
Copyright © 2011-2022 走看看