• 文件操作


    文件的基本操作

    什么是文件

    文件是操作系统虚拟出来的概念,用来存储信息

    操作文件的流程

    • 打开文件
    • 修改/读取文件
    • 保存文件
    • 关闭文件
    f = open('test.txt', 'w', encoding='utf8')   # 打开文件
    
    f.write('''
    孩儿立志出湘关,学不成名誓不还
    埋骨何须桑之地,人生无处不青山
    ''')   # 修改文件
    
    f.flush()   # 快速保存,可以不用
    
    f.close()  # 关闭文件
    

    文件打开模式的三种方式

    文件操作的基础模式有三种:

    • r 只读不可写
    • w 清空文件只写不可读
    • a 模式 追加 只写不可读

    文件操作的两种方法: (默认是t模式)

    • t模式为text 文本
    • b模式 为 二进制数

    t / b模式不能单独使用,需要与r / w / a 连用

    文件操作之r模式

    f = open('test.txt', 'r', encoding='utf-8')
    data = f.read()
    print(data)
    print(f.readable())  # True
    print(f.writable())  # False
    

    f.read()读取文件指针会走到文件末尾,再次读取会 空格

    f = open('test.txt', 'r', encoding='utf-8')
    data1 = f.read()
    data2 = f.read()
    print('data1:', data1)
    print('data2:', data2)
    
    # 打印结果:
    data1: 孩儿立志出相关,学不成名誓不还
    埋骨何须桑梓地,人生何处不青山
    
    data2: 
    
    

    f.read() 一次性读取文件内容,如果文件过大,内存可能会爆炸,可以用f.readline() / f.readlines()读取

    f = open('test.txt', 'r', encoding='utf-8')
    data1 = f.readline()  # 一行行读取
    data2 = f.readlines()   # 读取后,放入列表存起来
    print(data1)
    print(data2)
    
    # 打印结果:
    孩儿立志出相关,学不成名誓不还
    
    ['埋骨何须桑梓地,人生何处不青山
    ']
    

    rb模式 读二进制文件,不需要字符编码

    f = open('test.txt', 'rb')
    data = f.read()
    print(data)
    
    # 打印结果:
    b'xe5xadxa9xe5x84xbfxe7xabx8bxe5xbfx97xe5x87xbaxe7x9bxb8xe5x85xb3xefxbcx8cxe5xadxa6xe4xb8x8dxe6x88x90xe5x90x8dxe8xaax93xe4xb8x8dxe8xbfx98
    xe5x9fx8bxe9xaaxa8xe4xbdx95xe9xa1xbbxe6xa1x91xe6xa2x93xe5x9cxb0xefxbcx8cxe4xbaxbaxe7x94x9fxe4xbdx95xe5xa4x84xe4xb8x8dxe9x9dx92xe5xb1xb1
    '
    

    文件操作之w模式

    w模式,只可写不可读,如果文件存在则清空文件内容写入;如果文件不存在则创建文件写入内容。

    f = open('test.txt', 'w', encoding='utf-8')
    f.write('asfg')
    

    文件操作之a模式

    a模式,只可写不可读,文件存在则在文件的末端追加内容; 文件不存在则创建文件写入内容。

    f = open('test.txt', 'a', encoding='utf-8')
    f.write('qqq')
    

    绝对路径和相对路径

    • 绝对路径: 从盘符开始 D:project est.py
    • 相对路径:执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开文件属于同一文件夹下

    with管理上下文

    with提供一个自动关闭文件(解除了操作系统的占用)

    with open('test.txt', 'r', encoding='utf-8') as fr:
        data = fr.read()   # 缩进下不会关闭文件,在缩进下对文件进行操作
        print(data)
    
    print(fr)  # 关闭文件(操作系统层面上的)  但文件还存于python内存中
    
    # print(fr.read())  # 这里的操作设计操作系统,会报错
    

    文本文件处理的高级应用

    三种可读可写的模式

    • r+ 可读,可写
    • w+ 清空文件可写,可读
    • a+ 追加写,可读

    文件内指针移动

    seek(offset, whence):

    offset表示指针的偏移量,

    whence 规定只有 0 ,1 ,2 三种模式

    • 0表示光标在文件头

    • 1表示光标在当前位置

    • 2表示光标在文件尾部

    with open('36r.txt', 'rb') as fr:
        print(f"fr.seek(4, 0): {fr.seek(4, 0)}")  # 0相当于文件头开始;1相当于当前文件所在位置;2相当于文件末尾
        fr.seek(0,2)  # 切换到文件末尾
    

    tell 告诉你当前位置

    with open('test.py', 'rb') as fr:
        fr.seek(3, 0)
        print(fr.tell())
    

    truncate: 截断

    光标从文件头开始,到括号内的数字,之后的都删除

    with open('1.txt', 'ab') as fa:
        fa.truncate(2)
    

    以上seek,tell,truncate都是以字节为单位的

    read 移动光标以字符为单位

    with open('1.txt', 'r', encoding='utf8') as fr:
        print(fr.read(3))  # n表示n个字符,不加默认读取所有 # 中文和英文都属于一个字符
    

    文件的修改

    把硬盘中的文件全部读入内存中,一次性修改,修改完毕在覆盖在硬盘中

    import os
    
    with open('test.txt', 'r', encoding='utf-8') as fr, 
            open('test_swap.txt', 'w', encoding='utf-8') as fw:
        data = fr.read()  # 把文件一次性读入内存
        data = data.replace('青山', '故乡')  # 在内存中修改文件
    
        fw.write(data)  # 把修改后的文件写入新文件
    
    # 删除原文件
    os.remove('test.txt')
    # 把新文件重命名为原文件
    os.rename('test_swap.txt', 'test.txt')
    

    如果文件过大,一次性读入内存会炸掉,可以一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖原文件

    import os
    
    with open('test.txt', 'r', encoding='utf-8') as fr, open('test_swap.txt', 'w', encoding='utf-8') as fw:
        # 循环读取文件内容,逐行修改
        for line in fr:
            data = line.replace('青山', '故乡')
            # 写入新文件
            fw.write(data)
    
    os.remove('test.txt')
    os.rename('test_swap.txt', 'test.txt')
    
  • 相关阅读:
    安装centos出现的问题
    linux学习笔记
    sails框架结合mocha的测试环境搭建
    sails框架结合mocha
    使用postman发送http请求
    C++之易混淆知识点三---算法分析
    复习一下单链表的常用操作
    C++之易混淆知识点二
    FPGA之阻塞赋值与非阻塞赋值
    C++之易混淆知识点一-----static详解
  • 原文地址:https://www.cnblogs.com/setcreed/p/11544700.html
Copyright © 2020-2023  润新知