Python输入输出-IO流

本文介绍了Python中的IO流,包括open模块的使用方法,如打开文件、读写模式、编码解码、缓冲策略等。文章详细讲解了文本I/O和二进制I/O的区别,并提到了如何处理编码错误。此外,还探讨了缓冲流、原始文件I/O和缓冲流的类层次结构,以及在多线程环境中的安全性。
摘要由CSDN通过智能技术生成

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 "<pyshell#4>", 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
      
  • encoding 是用于解码或编码文件的编码名称。

    • 应该只在文本模式下使用(也就是官方不建议使用二进制模式下,给encoding传值)
    • 默认编码是依赖于平台的(不管locale.getpreferredencoding()返回任何值),但可以使用任何Python支持的 文本编码方式
  • errors是一个可选的字符串参数

    • 用于指定如何处理编码和解码错误(这不能在二进制模式下使用)。
    • 可以使用各种标准错误处理程序,但是使用codecs.register_error()注册的任何错误处理名称也是有效的。标准名称
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值