zoukankan      html  css  js  c++  java
  • Python 文件操作

    今日目录:

    一、文件处理

        1.什么是文件
        2.为何用文件
        3.如何用文件
        4.文件操作
        5.常用方法
        6.文件内指针的移动
        7.with的使用
    

    一、文件处理

    1. 什么是文件

    文件是操作系统为用户/应用程序提供的一种操作硬盘的抽象单位
    

    2. 为何要用文件

    用户/应用程序对文件的读写操作会由操作系统转换称具体的硬盘操作
    所以用户/应用程序可以通过简单的读/写文件来间接地控制复杂的硬盘的存储操作,实现将内存中的数据用具保存到硬盘中
    

    3. 如何用文件

    f = open(...)#打开文件,拿到一个文件对象f,f就相当于
    
    绝对地址: open(r"D:sh.txt")
    相对地址: .  # 当前目录下
    
    #向操作系统发送请求,要求操作系统打开文件
    f = open(r"sh.txt",encoding="utf-8")
    
    f.read()
    强调:一定要在程序结束前关闭打开的文件
    

    4. 文件操作

    4.1 主模式
    r:只读模式L(默认)
    	当文件不存在时,会报错
    	当文件存在时,文件指针指向文件的开头
    
    w:只写模式
    	当文件不存在时,新建一个空文档
    	当文件存在时,清空文件内容,文件指针跑到文件的开头
    
    	info = ['egon:123
    ','alex:456
    ','lxx:lxx123']
    	f.writelines(info) #将列表里面的数据,一行行的写进去(自动换行)
    
    a:追加 写模式
    	当文件不存在时,新建一个空文档,文件指针跑到文件的末尾
    	当文件存在时,文件指针跑到文件的末尾
    
    	在文件打开不关闭的情况下,连续的写入,下一次写入一定是基于上一次写入指针位置而继续的
    	f.write()
    	f.writelines()
    
    4.2 文件操作从模式(必须与r/w/a连用)
    t:文本模式(默认的),一定指定encoding参数
    	优点:操作系统会将硬盘中的二进制数字解码成Unicode然后返回
    	强调:只针对文本文件有效
    
    b:二进制模式:一定不能指定encoding参数
    	优点: 
    
    +:可读可写
    
    r+: 不会创建文件的可读可写 
    w+:创建清空文件的可读可写 
    a+:创建不清空文件(追加)的可读可写
    rb: 二进制读 
    wb:创建清空文件的二进制写  
    ab: 创建不清空文件(追加)的二进制写
    rb+ | wb+ | ab+
    
    # ps: x:写模式,创建文件,如果文件以存在,就抛异常
    with open('000.txt', 'x', encoding='utf-8') as f:
    	pass
    
    4.3 案例
    # 需求:
    # 1.完成文本类型的文件复制:1.txt => 11.txt
    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()
    

    5. 常用方法

    #掌握
    f.read() #读取所有内容,光标移动到文件末尾
    f.readline() #读取一行内容,光标移动到第二行首部
    f.readlines() #读取每一行内容,存放于列表中
    
    f.write('1111
    222
    ') #针对文本模式的写,需要自己写换行符
    f.write('1111
    222
    '.encode('utf-8')) #针对b模式的写,需要自己写换行符
    f.writelines(['333
    ','444
    ']) #文件模式
    f.writelines([bytes('333
    ',encoding='utf-8'),'444
    '.encode('utf-8')]) #b模式
    f.flush() #立刻将文件内容从内存刷新到硬盘
    
    #了解
    f.readable() #文件是否可读
    f.writable() #文件是否可写
    

    6. 控制文件内指针的移动

    6.1 方法
    f.seek()  # seek(偏移量, 偏移位置)
    f.tell()
    f.read(n)
    f.truncate()
    
    6.2 案例: 游标操作
    # 方法: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')
    
    6.3 百度网盘秒传分析
    # 案例
    #以图片为例,按照一定规则从文件中摘取一些数据,
    #加工后通过与服务器端数据进行对比,如果数据一样则不需要传输,
    #直接将服务器内文件地址给用户即可
    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('慢慢传去吧')
    

    7. with:将文件的释放交给with管理

    7.1 使用方法
    with open('1.txt', 'r', encoding='utf-8') as r,
        open('source.txt', 'w', encoding='utf-8') as w:
        for line in r:
            w.write(line)
            w.flush()
        # w.close() 系统自动完成
        # r.close()
    
    7.2 案例
    #完成文本文件的赋值
    # 边读边写赋值
    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)
    #完成非文本文件的赋值
    # 非文本文件,使用二进制读写,不设置encoding
    with open('333.mp4', 'rb') as f1:  
        with open('666.mp4', 'wb+') as f2:
            for line in f1:
                f2.write(line)
  • 相关阅读:
    动态调用WCF服务
    矩阵的坐标变换(转)
    【.NET线程--进阶(一)】--线程方法详解
    [转] Location语法规则
    [转] 深入理解vue 一些底层原理
    [转] lodash常用方法
    [转] Vue 组件间通信六种方式(完整版)
    [转] vuejs组件通信精髓归纳
    [转] 浅谈移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID
    [转] vue自定义组件中的v-model简单解释
  • 原文地址:https://www.cnblogs.com/xt12321/p/10609499.html
Copyright © 2011-2022 走看看