• Python文件操作


    方法介绍

    Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

    注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

    # open函数的语法格式
    
    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
        file: 必需,文件路径(相对或者绝对路径)。
        mode: 可选,文件打开模式
        buffering: 设置缓冲
        errors: 报错级别
        newline: 区分换行符
        closefd: 传入的file参数类型
    

    mode的参数有:

    模式 描述
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。先读后写才是安全的
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

    file中的常用方法:

    方法 描述
    file.close() 关闭文件。关闭后文件不能再进行读写操作。
    file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
    file.next() 返回文件下一行
    file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有
    file.readline([size]) 读取整行,包括 " " 字符。
    file.readlines([sizehint]) 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比sizhint较大, 因为需要填充缓冲区。
    file.seek(offset[, whence]) 设置文件当前位置
    file.tell() 返回文件当前位置。
    file.truncate([size]) 截取文件,截取的字节通过size指定,默认为当前文件位置。
    file.write(str) 将字符串写入文件,没有返回值
    file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

    文件操作

    读取文件

    read

    # 路径有两种:
    # 1.相对路径,相对于当前程序所在的文件夹
    #    ../ 返回上一层目录
    #    相对的是当前程序所在的文件夹
    # 2.绝对路径
    #   * 从磁盘根目录寻找
    #   * 互联网上的绝对路径
    
    f = open("a.txt", mode="r", encoding="utf-8")
    
    # read函数的参数是读取多少个字节,如果不加参数,默认是一次性读取文件的所有内容
    data = f.read()
    # 打印读取的文件内容
    print(data)
    
    # 关闭文件
    f.close()
    

    readlines

    就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。

    f = open("a.txt", mode="r", encoding="utf-8")
    
    data = f.readlines()
    # 打印读取的文件内容
    print(type(data))   # <class 'list'>
    
    # 关闭文件
    f.close()
    

    readline

    读取一行数据

    f = open("a.txt", mode="r", encoding="utf-8")
    
    # 只读取一行数据
    data = f.readline()
    # 打印读取的文件内容
    print(data)
    
    # 关闭文件
    f.close()
    

    读取大文件

    f = open("a.txt", mode="r", encoding="utf-8")
    
    # 读取大文件的方法
    for line in f:
        print(line)
    # 关闭文件
    f.close()
    

    对可迭代对象 f,进行迭代遍历:for line in f,会自动地使用缓冲IO(buffered IO)以及内存管理,而不必担心任何大文件的问题。

    写文件

    # w 模式写文件会将源文件覆盖
    f = open("a.txt", mode="w", encoding="utf-8")
     
    f.write("aaa")
    # 关闭
    f.close()
    

    追加:

    # 追加
    f = open("a.txt", mode="a", encoding="utf-8")
    f.write("ddd")
    f.flush()
    f.close()
    
    # r+ 默认模式指针在文件的开头
    # f = open("老师点名", mode="r+", encoding="utf-8")
    # s = f.read()
    # print(s)
    # f.write("周杰伦")
    # f.close()
    # 神坑
    f = open("精品", mode="r+", encoding="utf-8")
    s = f.read(3)  # 读3个字符
    # 不管你前面读了几个,后面去写都是在末尾
    f.write("aabbcc")  # 没有任何操作之前进行写,在开头写,如果读取了一些内容后再写,则是在最后
    f.flush()
    f.close()
    

    文件内的光标移动

    一: read(3):
      1. 文件打开方式为文本模式时,代表读取3个字符
      2. 文件打开方式为b模式时,代表读取3个字节
    二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
        seek(offset[, whence])
            offset -- 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始
            whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
    
    
    注意:
      1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
      2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
    
    #!/usr/bin/python3
     
    # 打开文件
    fo = open("runoob.txt", "r+")
    print ("文件名为: ", fo.name)
     
    line = fo.readline()
    print ("读取的数据为: %s" % (line))
     
    # 重新设置文件读取指针到开头
    fo.seek(0, 0)
    line = fo.readline()
    print ("读取的数据为: %s" % (line))
     
     
    # 关闭文件
    fo.close()
    

    with操作

    为了避免打开文件后忘记关闭,可以通过管理上下文,即:
      with open('log','r') as f:
    如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
     
    在Python 2.7 后,with又支持同时对多个文件的上下文进行管理即:
    with open('log1') as obj1, open('log2') as obj2:
    
    with open("a.txt", mode="r", encoding="utf-8") as f:
        data = f.read()
        print(data)
    

    文件备份:

    # 提示输入文件
    oldFileName = input("请输入要拷贝的文件名字:")
    
    # 以读的方式打开文件
    oldFile = open(oldFileName,'rb')
    
    # 提取文件的后缀
    fileFlagNum = oldFileName.rfind('.')
    if fileFlagNum > 0:
        fileFlag = oldFileName[fileFlagNum:]
    
    # 组织新的文件名字
    newFileName = oldFileName[:fileFlagNum] + '[复件]' + fileFlag
    
    # 创建新文件
    newFile = open(newFileName, 'wb')
    
    # 把旧文件中的数据,一行一行的进行复制到新文件中
    for lineContent in oldFile.readlines():
        newFile.write(lineContent)
    
    # 关闭文件
    oldFile.close()
    newFile.close()
    

    文件的相关操作

    import os
    
    # 文件重命名
    os.rename("毕业论文.txt", "毕业论文-最终版.txt")
    
    # 删除文件
    os.remove("毕业论文.txt")
    
    # 创建文件夹
    os.mkdir("abc")
    
    # 获取当前目录
    os.getcwd()
    
    # 改变默认目录
    os.chdir("../")
    
    # 获取目录列表
    os.listdir("./")
    
    # 删除文件夹
    os.rmdir("abc")
    

    修改文件内容:

    # 创建新文件,把修改后的文件写入新文件,删除老文件,再重命名新文件
    
    import os
    
    with open("吃的", mode="r", encoding="utf-8") as f1, 
            open("吃的_副本", mode="w", encoding="utf-8") as f2:
        for line in f1:
            new_line = line.replace("肉", "菜")
            f2.write(new_line)
    
    
    os.remove("吃的")     # 删除文件
    os.rename("吃的_副本", "吃的")    # 重命名文件
    

    批量修改文件名:

    #coding=utf-8
    # 批量在文件名前加前缀
    import os
    
    funFlag = 1 # 1表示添加标志  2表示删除标志
    folderName = './renameDir/'
    
    # 获取指定路径的所有文件名字
    dirList = os.listdir(folderName)
    
    # 遍历输出所有文件名字
    for name in dirList:
        print name
    
        if funFlag == 1:
            newName = '[东哥出品]-' + name
        elif funFlag == 2:
            num = len('[东哥出品]-')
            newName = name[num:]
        print newName
    
        os.rename(folderName+name, folderName+newName)
    
  • 相关阅读:
    Selenium开发环境搭建
    如何抓取移动端崩溃日志?
    html+ashx + NPOI 实现导出Excel文件并且预览和下载
    oss 文件上传:Web端上传介绍
    事务控制和锁定语句
    索引的设计和使用
    最近几年读过的书籍
    053.NET5_EFCoreMigration
    052.NET5_EFCoreDbFirst
    051.NET5_中间件的多种引用方式
  • 原文地址:https://www.cnblogs.com/fengyuhao/p/11697541.html
Copyright © 2020-2023  润新知