• 文件操作


    计算机文件:硬盘中一块储存空间(虚拟的文件)

    文件操作:根据文件名来操作硬盘的那块存储空间,操作方式为 读read,写write

    文件的模式:

    r: 读
    w: 写(无创建,有清空)
    a: 追加(有创建的功能)
    
    t: 文本操作(默认模式) r=>rt w=>wt a=>at
    b: 非文本文件必须采用二进制模式来处理
    +: 可读可写
    r+: 不会创建文件的可读可写 | w+:创建清空文件的可读可写 | a+:创建不清空文件(追加)的可读可写

    使用文件的三大步骤:
    1,打开文件
    2,操作文件
    3,关闭文件(*****)

    1、打开文件
    变量名 = 文件空间
    文件路径 操作模式(读|写) 编码
    f = open('a.txt', 'r', encoding='utf-8')

    2、操作文件

    data = f.read(3)      # 将所有内容读取出来,如果设置读取长度,按照规定长度读取数据
    print(data)

    读取文件的方法(r):

    一次读取一行
    line = f.readline()
    print(line)
    line = f.readline()
    print(line)
    
    按行一次性全部读出
    lines = f.readlines()
    print(lines)
    
    逐步一行一行读取
    l = []
    for line in f:
        print(line)
          l.append(line)
      print(l)
    
      s = set()
      for line in f:
          # print(line)
          s.add(line)
      print(s)
    View Code

    3、关闭文件
    f.close()     # 释放操作系统对文件的持有,变量f还被应用程序持有

     基础写(w)
    文件不存在:会新建文件,再操作文件
    文件存在:先清空文件,再操作文件
    w = open('b.txt', 'w', encoding='utf-8')
    w.write('456')
    w.close()

    w.flush()把内存文件刷入硬盘         #在写入大量数据,要及时处理内存空间不然内存可能溢出导致数据丢失
    w.close()       #1;把内存的数据刷新到硬盘中 2;释放文件资源

    完成文本复制

    r = open('1.txt', 'r', encoding='utf-8')
    w = open('11.txt', 'w', encoding='utf-8')
    for line in r:  # 遍历就是一行一行读 取读文件的流
        w.write(line)
        w.flush()
    w.close()
    r.close()
    View Code

    借助读写,完成追加

     with open('1.txt', 'rt', encoding='utf-8') as f1:
         data = f1.read()
         data += '666'
     with open('1.txt', 'wt', encoding='utf-8') as f2:
         f2.write(data)
    View Code

    模式a:

     a为写模式,在原数据后追加写入新数据
    with open('1.txt', 'a', encoding='utf-8') as f:
    f.write('777')

    with 打开文件: 

    with open('1.txt', 'rt', encoding='utf-8')  as f:
     f.read()

    whith  完成文本复制

    先读后写

    with open('source.txt', 'r', encoding='utf-8') as f1, 
        open('target.txt', 'a', encoding='utf-8') as f2:
        # 读取一个字节,如果是行/文件等结束标识,就返回该标识,否则返回None
        print(f1.newlines)
    
        first_data = f1.read(9)
        f2.write(first_data)
        f2.flush()
    
        print(f1.newlines)
    
        second_data = f1.readline()
        f2.write(second_data)
        f2.flush()
    
        last_data = f1.read()
        f2.write(last_data)
        f2.flush()
    
        print(f1.newlines)
        data = f1.read()
        print(data)
    View Code

    边读边写赋值

    with open('source.txt', 'r', encoding='utf-8') as f1:
        with open('target.txt', 'a+', encoding='utf-8') as f2:
            for line in f1:
                f2.write(line)
    View Code

    非文本文件复制

    with open('333.mp4', 'rb') as f1:
        with open('666.mp4', 'wb+') as f2:
            for line in f1:
                f2.write(line)

    x:写模式,创建文件,如果文件以存在,就抛异常
    with open('000.txt', 'x', encoding='utf-8') as f:
      pass

    方法:seek(偏移量, 偏移位置)
    偏移量:移动的字节数,负数是结合模式1,2往前偏移
    偏移位置:
    -- 0 - 从文件开始位置开始偏移 | 1 - 从当前游标位置开始偏移 | 2 - 从文件末尾开始偏移
    b'你好1234567890'

    # 游标读
    with open('source.txt', 'rb') as f:
    d1 = f.read(11)
    print(d1)
    # print(d1.decode('utf-8'))

    # 当前游标的位置
    print(f.tell())

    # 游标操作 - 从末尾位置开始
    f.seek(-3, 2)
    d2 = f.read()
    print(d2.decode('utf-8')) # 890

    # # 游标操作 - 从当前位置开始
    # f.seek(-3, 1)
    # d2 = f.read()
    # print(d2.decode('utf-8')) # 34567890

    # # 游标操作 - 从头开始
    # f.seek(3, 0)
    # d2 = f.read()
    # # print(d2)
    # print(d2.decode('utf-8')) # 好1234567890

    # 游标写:会覆盖书写
    with open('source.txt', 'rb+') as f:
    f.seek(11)
    # print(f.read())
    f.write(b'000')

    print("-------------------------------------")
    # 案例
    with open('001.png', 'rb') as f:
    data = f.read()
    print(len(data))

    # 在大文件中,开头| 1/3 | 2/3 | 末尾 各取10个字节拼接成秒传的信息依据
    # 形成秒传规则
    tagData = b''
    with open('001.png', 'rb') as f:
    # 通过其他途径(sys模块)来获取文件总大小
    data = f.read()
    length = len(data)
    # 开头
    f.seek(0, 0)
    d1 = f.read(10)
    # 1/3
    f.seek(length // 3, 0)
    d2 = f.read(10)
    # 2/3
    f.seek(length // 3 * 2, 0)
    d3 = f.read(10)
    # 末尾
    f.seek(-10, 2)
    d4 = f.read(10)
    tagData = d1 + d2 + d3 + d4
    # 秒传依据
    print(tagData)

    newData = b""
    with open('001.png', 'rb') as f:
    data = f.read()
    length = len(data)
    f.seek(0, 0)
    newData += f.read(10)
    f.seek(length // 3, 0)
    newData += f.read(10)
    f.seek(length // 3 * 2, 0)
    newData += f.read(10)
    f.seek(-10, 2)
    newData += f.read(10)

    if newData == tagData:
    print('秒传成功')
    else:
    print('慢慢传去吧')
  • 相关阅读:
    【web性能优化】DNS解析与ip
    【web性能优化】雅虎军规
    【web性能优化】优化提纲及图片优化(慕课网笔记)
    【web性能优化】常用缓存方式(慕课网学习笔记)
    【前端】企业微信客户端调试
    【es6】es6使用集锦
    【前端】遇到的各种报错
    【前端】安装wampserver提示丢失MSVCR100.dll的解决方法
    【es6】将2个数组合并为一个数组
    【web】使用ionic搭建移动端项目 icon-radio 标签在ios下全部选中的问题
  • 原文地址:https://www.cnblogs.com/wangtenghui/p/10609719.html
Copyright © 2020-2023  润新知