zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    uva 147 Dollars
    hdu 2069 Coin Change(完全背包)
    hdu 1708 Fibonacci String
    hdu 1568 Fibonacci
    hdu 1316 How Many Fibs?
    poj 1958 Strange Towers of Hanoi
    poj 3601Tower of Hanoi
    poj 3572 Hanoi Tower
    poj 1920 Towers of Hanoi
    筛选法——素数打表
  • 原文地址:https://www.cnblogs.com/fengyuhao/p/11697541.html
Copyright © 2011-2022 走看看