美文网首页
Lesson 024 —— python 文件操作

Lesson 024 —— python 文件操作

作者: 爱喵喵的鱼 | 来源:发表于2018-11-04 21:38 被阅读0次

    Lesson 024 —— python 文件操作

    open() 方法

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

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

    open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

    open(file, mode='r')
    

    完整的语法格式为:

    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    

    参数说明:

    • file: 必需,文件路径(相对或者绝对路径)。
    • mode: 可选,文件打开模式
    • buffering: 设置缓冲
    • encoding: 一般使用utf8.使用 b 模式打开,不能指定 encoding 编码。使用 t 模式,相当于使用 b 模式打开然后进行编码(使用 decode 进行解码)翻译。
    • errors: 报错级别
    • newline: 区分换行符。newline=‘ ’表示不进行转换(即\r\n 转换为 \n)。
    • closefd: 传入的file参数类型
    • opener:

    mode 参数

    模式 描述
    t 文本模式 (默认)。
    x 写模式,新建一个文件,如果该文件已存在则会报错。
    b 二进制模式。
    + 打开一个文件进行更新(可读可写)。
    U 通用换行模式(不推荐)。
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
    w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

    默认为文本模式,如果要以二进制模式打开,加上 b

    024-01
    模式 r r+ w w+ a a+
    + + + +
    + + + + +
    创建 + + + +
    覆盖 + +
    指针在开始 + + + +
    指针在结尾 + +

    file 对象

    只要不是 read() 方法,其余的方法移动光标都是按字节计算。read() 方法按照字符计算。seek() 按字节调整光标,若要使用 seek() 其他模式(默认从头开始),使用二进制模式读入文件。

    file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:

    序号 方法及描述 描述
    1 file.close() 关闭文件。关闭后文件不能再进行读写操作。
    2 file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
    3 file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
    4 file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。
    5 file.next() 返回文件下一行。
    6 file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。
    7 file.readline([size]) 读取整行,包括 "\n" 字符。
    8 file.readlines([sizeint]) 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
    9 file.seek(offset[, whence]) 设置文件当前位置。offset:开始的偏移量,也就是代表需要移动偏移的字节数。whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
    10 file.tell() 返回文件当前位置,即文件指针当前位置。
    11 file.truncate([size])] 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。
    12 file.write(str) 将字符串写入文件,返回的是写入的字符长度。
    13 file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

    文件对象属性

    编号 属性 描述
    1 file.closed 如果文件关闭则返回true,否则返回false
    2 file.mode 返回打开文件的访问模式。
    3 file.name 返回文件的名称。

    使用 with 操作文件

    获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。
    如果不用with语句,代码如下:

    file = open("/tmp/foo.txt")
    data = file.read()
    file.close()
    

    这里有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。下面是处理异常的加强版本:

    file = open("/tmp/foo.txt")
    try:
        data = file.read()
    finally:
        file.close()
    

    虽然这段代码运行良好,但是太冗长了。这时候就是with一展身手的时候了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码:

    with open("/tmp/foo.txt") as file:
        data = file.read()
    

    这看起来充满魔法,但不仅仅是魔法,Python对with的处理还很聪明。基本思想是with所求值的对象必须有一个enter()方法,一个exit()方法。紧跟with后面的语句被求值后,返回对象的enter()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的exit()方法。

    class Sample:
        def __enter__(self):
            print("In __enter__()")
            return "Foo"
     
        def __exit__(self, type, value, trace):
            print("In __exit__()")
     
    def get_sample():
        return Sample()
     
    with get_sample() as sample:
        print("sample:", sample)
        
    # 结果
    In __enter__()
    sample: Foo
    In __exit__()
    
    1. enter()方法被执行
    2. enter()方法返回的值 - 这个例子中是"Foo",赋值给变量'sample'
    3. 执行代码块,打印变量"sample"的值为 "Foo"
    4. exit()方法被调用

    with真正强大之处是它可以处理异常。可能你已经注意到Sample类的exit方法有三个参数- val, type 和 trace。 这些参数在异常处理中相当有用。实际上,在with后面的代码块抛出任何异常时,exit()方法被执行。正如例子所示,异常抛出时,与之关联的type,value和stack trace传给exit()方法,因此抛出的ZeroDivisionError异常被打印出来了。开发库时,清理资源,关闭文件等等操作,都可以放在exit方法当中。

    打开大文件

    with语句打开和关闭文件,包括抛出一个内部块异常。for line in f文件对象f视为一个迭代器,会自动的采用缓冲IO和内存管理,防止内存溢出。

    #If the file is line based
    with open(...) as f:
      for line in f:
        process(line) # <do something with line>
    

    相关文章

      网友评论

          本文标题:Lesson 024 —— python 文件操作

          本文链接:https://www.haomeiwen.com/subject/tfidxqtx.html