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

    文件处理

    什么是文件处理 :修改存储的信息

    什么是文件:操作系统提供的虚拟概念,存储信息(用二进制存储信息)

    什么是文本:.txt/.word/.md/.py/.xml/.ini 存储的是文字

    视频/音频文件(多媒体文件)

    # 1. 打开文件 ①文件路径Copy Path②打开模式,w-->write③
    f = open(r'D:day 09	est.py','w',encoding='utf8')
    
    # 2. 读取/修改操作
    f.write('''
    孩儿立志出湘关,学不成名誓不还
    埋骨何须桑之地,人生无处不青山
    ''')
    
    # 3. 保存文件
    f.flush()    # 快速保存,你可以不使用
    
    # 4. 关闭文件
    f.close()  # 告诉操作系统关闭文件
    
    
    # file_path = r'D:day09	est.py','w',encoding='utf8'
    # f = open(file_path)  # 把该路径的文件读入内存,只是没有可视化的界面而已
    # print(f)
    # data = f.read()  # 读取文件
    # print(data)
    # f.close()
    

    文件的三种打开方式

    # 打开文件的三种模式 
    r--》read(只读不可写)
    w-->write(只写不可读,清空文本文件)
    a--》append(只写不可读,追加)
    
    
    # 读取:rt  read_text 读文本内容 只读
    print(f.readable()) # 判断是否可读
    print(f.writable()) # 判断是否可写
    
    # r-->只读;
    data = f.read()  # 读取所有文本内容
    print(data)
    # 仅作了解
    # print(f.readline())  # 一行一行读取
    # print(f.readlines())  # 读取所有行放入列表 
    
    
    # 要循环读出文本内容
    for i in f.read():  # 循环出一个个字符
        print(i)
    for i in f:  # 循环出一行行 # 节省内存
        print(i)
    
        
    # 文本读一行少一行,每一行末尾默认有一个换行
    for i in f:
        print(i)
    
    # print('f.readline():',f.readline())
    
    # wt: 只写(w清空文件后写入),不可读
     f = open(r'D:day 09	est.py', 'wt', encoding='utf8')
    print(f.readable())
    print(f.writable())
    
    f.write('abc')  w-->清空写入;
    
    # 仅作了解
    # f.writelines(['abc', 'edf', 'gbk'])  # 自动拼接列表元素,一行写入
    
    # at: 只写入(追加写入) a-->追加写入
    f = open(r'D:day 09	est.py', 'at', encoding='utf8')
    print(f.readable())
    print(f.writable())
    

    encoding编码格式

    # encoding指定写入的编码格式
    f = open(r'D:day 09	est.py', 'at', encoding='gbk')
    f.write('中')
    
    # encoding指定读文件的编码格式
    f = open(r'D:day 09	est.py', 'rt', encoding='gbk')
    print(f.read())
    

    打开文件的两种模式

    b模式

    所以音频通过rb模式打开-->读取二进制,b模式下没有encoding这个参数,b不单独使用,一般与r

    # t和b模式
    # gbk/utf8只针对文本,所以音频通过rb模式打开-->读取二进制,b模式下没有encoding这个参数,b不单独使用,一般与r/w/a一起配合使用
    
     f = open(r'D:day 09	est.py','rb')  # 读入内存
     data = f.read()
    
    # b模式一般用于图片/音频/视频的保存
    import requests
    
    response = requests.get('http://photocdn.sohu.com/20120708/Img347586981.jpg')
    data = response.content  # 拿到图片的二进制
    # print(data)
    
    # w和a模式可以自动创建文件   没有就创建有就覆盖
    f = open(r'D:day 09	est.jpg', 'wb')
    f.write(data)
    

    t模式

    t模式针对文本文件,t模式不单独使用,必读得和r/w/a一起使用

    rt模式,默认r

    f = open(r'D:day 09关于实施乡村振兴战略的意见.txt','rt',encoding='utf8')
    data = f.read()
    print(data)
    
    # rt --> py/md(默认编码是utf8)/txt(默认编码是gbk)/word(默认编码是utf8)/ini
    
    
    # pdf(PyPDF2)/excel(pandas)/xml(xml)/json/pkl (无法控制,可以使用其他模块(自己百度))
    

    绝对路径和相对路径

    # 文件的路径: 文件在硬盘的地址
    
    # 绝对路径: 从盘符开始 D:day 09	est.py
    
    # 相对路径: 执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开文件属于同一文件夹下
    
    
    # 未来些项目尽量用相对路径
    f = open('test.py','r',encoding='utf8')
    print(f.read())
    

    with管理文件上下文

    # with提供一个自动关闭文件(接触了操作系统的占用)
    with open('test.py', 'r', encoding='utf8') as f:
        print(f.read())
        # 在这个缩进下不会关闭文件,在这个缩进下对文件操作
        
    # 关闭文件(操作系统),没有关闭python内存中的文件
    print(f)  # 只涉及python,不会报错
    print(f.read())  # .read()涉及操作系统,报错
    

    文件的高级应用

    # 三种新的模式(可读又可写),尽量不要使用
    
    # r只读/w清空写入/a追加写入  --> 要么只读,要么只写
    
    
    # 假设一个文件即可读又可写,假设写需要10s,读需要5s
    
    # 针对test.py,我们要写入一个国字,需要10s
    
    # 过了1s,我们读了这个文件,5s过后,我们看到文件只有一个中字
    
    # 感觉自己没写入,你会再一次写入一个国字(基于前面一个字是中字)
    
    # 4s过后,第一个的写入成功了,文件变成 中国 了
    
    # 再过6s,第二次写入一定失败
    
    # 以前就发生过(现在的电脑牛逼了,所以不会有这种事发生,但是还是有一定概率的)
    
    # 可写可读 r+
    with open('test.py', 'r+', encoding='utf8') as fr:
        print(fr.readable())
        print(fr.writable())
        fr.write('高级')  # 光标在文件头部,覆盖后面的字符
    
    
    # 可写可读 w+ 和 w 没有任何区别
    with open('test.py', 'w+', encoding='utf8') as fw:
        print(fw.readable())
        print(fw.writable())
    
        
    # 可写可读 a+ a模式默认光标在尾部
    with open('test.py','a+',encoding='utf8') as fw:
        print(fw.readable())
        print(fw.writable())
        fw.seek(0,0)
        print(fw.read())
    
    
    # 综上:如果你真的有即可读又可写的需求,用两种不同的模式打开两次文件
    

    光标的高级应用

    # 8个进制位为一个字节,3个8进制位组成一个字符(针对中文,英文是一个字节一个字符)
    # (00000000-->一个字节 00000000 00000000) --> 一个字符,对应三个字节,对应一个中文  --> utf8
    
    
    # 下三种移动光标的位置(以字节为单位)4
    # seek
    # with open('test.py', 'rb') as fr:
        # fr.seek(5)  # 移动了3个字节,一个中文,默认从开头开始
        # print(fr.read())
        # print(fr.read().decode('utf8'))
    
    # whence规定只有0,1,2 三种模式  # 0相当于文件头开始;1相当于当前文件所在位置;2相当于文件末尾
         fr.seek(3, 0)  # 0从开头
         # print(fr.read().decode('utf8'))
         fr.seek(3, 1)
         print(fr.read().decode('utf8'))
         fr.seek(0, 2)
         print(fr.read())
    
    # tell : 告诉你当前所在位置
     with open('test.py', 'rb') as fr:
         fr.seek(3, 0)
         print(fr.tell())
    
    # truncate: 截断
    with open('test.py', 'ab') as fa:
        fa.truncate(2)
    
    # 移动光标(以字符为单位)
    # read
    # with open('test.py', 'r', encoding='utf8') as fr:
    #     print(fr.read(3))  # n表示n个字符,不加默认读取所有 # 中文和英文都属于一个字符
    

    文件的修改

    with open('test.py', 'r+', encoding='utf8') as fr:
        fr.seek(0, 0)
        data = fr.read()
        print(data)
        fr.seek(3, 0)
        fr.write('干')
    
    # 文件没有修改一说,只有覆盖
    
    
    # 缓存文件的原理
    
    # 同时打开多个文件
     with open('test.py', 'r', encoding='utf8') as fr, 
             open('test_swap.py', 'w', encoding='utf8') as fw:
        data = fr.read()
        data = data.replace('sb', '傻逼')
    
        fw.write(data)
    
    import os
    
    os.remove('test.py')
    os.rename('test_swap.py', 'test.py')
    
  • 相关阅读:
    2019-9-2-C#枚举中使用Flags特性
    2019-9-2-C#枚举中使用Flags特性
    2019-8-31-C#-转换类型和字符串
    2019-8-31-C#-转换类型和字符串
    2019-8-31-C#-获取进程退出代码
    2019-8-31-C#-获取进程退出代码
    access truncate
    GIT分布式版本控制系统
    iSCSI的配置(target/initiator)
    chkconfig命令
  • 原文地址:https://www.cnblogs.com/jzm1201/p/12594890.html
Copyright © 2011-2022 走看看