Python输入输出-IO流

open模块

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
  • 打开给定路径的 file文件, 并返回对应的一个file object

  • 如果要打开的文件,不能被打开,就会触发 OSError异常;

  • file 是一个路径对象(str),表示将要打开的文件路径(绝对路径或当前工作目录的相对路径),也可以是被封装的整数类型文件描述符;

    • 如果是文件描述符,它会随着返回的I/O对象关闭而关闭,除非closefd被设为False;
  • mode 是一个可选字符串,用于指定打开文件的模式。默认是r,也就是默认以文本模式打开并读取。

    • 字符 含义
      ‘r’ 读取(默认)
      ‘w’ 写入,并先截断文件原本内容
      ‘x’ 排它性创建,如果文件已存在则失败
      ‘b’ 二进制模式
      ‘a’ 写入,如果文件存在则在末尾追加
      ‘t’ 文本模式(默认)
      ‘+’ 打开用于更新(读取与写入)
    • 默认模式为'r'(打开用于读取文本,与rt同义)。

    • 模式'w+''w+b'将打开文件并清空内容。

    • 模式'r+''r+b'将打开文件并不清空内容。

  • 在文本模式,如果encoding 没有指定,则根据系统平台来决定使用的编码。可以使用locale.getpreferredenconding(False)来获取自己平台的编码。

    >>> import locale
    >>> locale.getpreferredencoding(False)
    'cp936'  # 我的系统编码
    
  • buffering是一个可选的整数,用于设置缓冲策略。

    • 传递0以切换缓冲关闭(仅支持二进制模式下)

      >>> import os
      >>> os.getcwd()  # 查看当前工作目录
      'C:\\Users\\www13\\AppData\\Local\\Programs\\Python\\Python38-32'
      >>> ab = open('d:/data.txt', 'ab', buffering=0)  # 创建一个没有缓冲区的 file object
      >>> ab.write('hello 你好啊')  # 写入正常字符串,报错
      --------------------------Error-------------------------------
      Traceback (most recent call last):
        File "", line 1, in <module>
          ab.write('hello 你好啊')
      TypeError: a bytes-like object is required, not 'str'
      ---------------------------错误--------------------------------
      >>> ab.write(bytes('hello 你好啊'.encode()))  # 写入二进制字符串,响应正常为写入字节长度并且不需要close或flush就可以在文本中看到。
      15
      
    • 传递1选择行缓冲(仅支持文本模式下可用),并且>1的整数以指定固定大小的块缓冲区的大小(以字节为单位)。

      >>> ab = open('d:/data.txt', 'at', buffering=1)  # 创建行缓冲 file object
      
      >>> ab.write('你好,Vin\n')  # \n换行符结尾,自动刷新缓冲区
      7
      >>> ab.write('你好,Vin')  # 不会刷新缓冲区
      6
      >>> ab.write('你好,蟒蛇\n')  # 自动刷新缓冲区
      6
      >>> ab.write('你好,蟒蛇2')
      6
      >>> ab.write('你好,蟒蛇3')
      6
      >>> ab.write('你好蟒蛇4\n')
      6
      >>> 
      # 也就是说,buffering参数设置为1的情况下,想让它刷新缓冲区,它只认得 \n 这个东西。
      
      
      >>> ab = open('d:/data.txt', 'ab', buffering=5)  # 创建自定义字节大小缓冲 file object
      >>> ab.write(bytes('hello'.encode()))  # 刚好五个字节,不会刷新缓冲区。
      5
      >>> ab.flush()  # 先把之前的缓冲区刷新一下
      >>> ab.write(bytes('buffering=5'.encode()))  # 大于五个字节,自动刷新缓冲区。
      11
      
    • 如果没有给buffering参数,则默认缓冲策略的工作方式如下:

      • 二进制文件以固定大小的块进行缓冲;使用启发式方法选择缓冲区的大小,尝试确定底层设备的“块大小”或使用io.DEFAULT_BUFFER_SIZE。在许多系统上,缓冲区的长度通常为4096或8192字节。
      • “交互式”文本文件(isatty()返回True的文件)使用行缓冲。其它文本文件使用上述策略用于二进制文件。
      >>> ab = open('d:/data.txt', 'ab')  # 创建一个有缓冲区的 file object
      >>> ab.write(bytes('hi LiLa Vin'.encode()))  # 写入响应正常,但是文本却看不到,因为还在缓冲区中,没有到达默认的缓冲区长度。
      11
      >>> ab.close()  # 或 ab.flush

你可能感兴趣的:(Python3.8入门学习,python,流处理,类)