可以做动感影集的网站,汽车配件加工网,临沂营销网站建设,从化手机网站建设io 模块提供了 Python 用于处理各种 I/O 类型的主要工具。三种主要的 I/O类型分别为: 文本 I/O, 二进制 I/O 和 原始 I/O。 io.open()
是内置的 open() 函数的别名.
语法#xff1a;
open(file,moder,buffering-1,encodingNone,errorsNone,newlineNone,closefdTrue,openerN…io 模块提供了 Python 用于处理各种 I/O 类型的主要工具。三种主要的 I/O类型分别为: 文本 I/O, 二进制 I/O 和 原始 I/O。 io.open()
是内置的 open() 函数的别名.
语法
open(file,moder,buffering-1,encodingNone,errorsNone,newlineNone,closefdTrue,openerNone,
)
参数
filefile 是一个类路径对象path-like object表示将要打开的文件的路径mode默认为 r用于指定打开文件的模式可见下文介绍。buffering设置缓冲策略encoding是用于解码或编码文件的编码的名称这只能在文本模式下使用默认编码依赖于平台但 Python 支持的任何编码都可以传递。errors指定如何处理编码和解码错误不能在二进制模式下使用。newline控制如何换行closefd如果 closefd 为 False 且给出的不是文件名而是文件描述符那么当文件关闭时底层文件描述符将保持打开状态。如果给出的是文件名则 closefd 必须为 True 默认值否则将触发错误。opener 可以通过传递可调用的 opener 来使用自定义开启器。然后通过使用参数 fileflags 调用 opener 获得文件对象的基础文件描述符。 opener 必须返回一个打开的文件描述符使用 os.open as opener 时与传递 None 的效果相同。
file参数
file 是一个类路径对象path-like object表示将要打开的文件的路径绝对路径或者相对当前工作目录的路径也可以是要封装文件对应的整数类型文件描述符。如果给出的是文件描述符则当返回的 I/O 对象关闭时它也会关闭除非将 closefd 设为 False 。
路径类对象path-like object代表一个文件系统路径的对象。类路径对象可以是一个表示路径的 str 或者 bytes 对象还可以是一个实现了 os.PathLike 协议的对象。一个支持 os.PathLike 协议的对象可通过调用 os.fspath() 函数转换为 str 或者 bytes 类型的文件系统路径os.fsdecode() 和 os.fsencode() 可被分别用来确保获得 str 或 bytes 类型的结果。此对象是由 PEP 519 引入的。
mode参数
mode 是可选的字符串用于指定打开文件的模式。默认值是 r 表示以文本模式打开并读取文件。其他常见模式有写入模式 w 已存在文件会被清空、独占创建模式 x 、追加写入模式 a 在 某些 Unix 系统中无论当前文件指针在什么位置所有 的写入操作都会追加到文件末尾。在文本模式如果未指定 encoding 则会根据当前平台决定编码格式调用 locale.getpreferredencoding(False) 获取当前地区的编码。若要读写原生字节格式请使用二进制模式且不要指定 encoding。
可用的模式有
r读文件 (默认)w打开以进行写入首先截断文件x创建一个新文件并打开它进行写入如果存在则失败a打开进行写入如果文件存在则追加到文件末尾b二进制模式t文本模式 (默认)打开文件进行更新读写U通用换行模式已弃用
一些规则
默认模式为 r 打开文件用于读取文本与 rt 同义。w 和 wb 模式将打开文件并清空内容。而 r 和 rb 模式将打开文件但不清空内容。
Python 区分二进制和文本I/O。以二进制模式打开的文件包括 mode 参数中的 b 返回的内容为 bytes 对象不进行任何解码。在文本模式下默认情况下或者在 mode 参数中包含 t 时文件内容返回为 str 首先使用指定的 encoding 如果给定或者使用平台默认的的字节编码解码。
另外还有一种模式字符 U 可用不过它已失效并视作弃用。以前它会在文本模式中启用 universal newlines这在 Python 3.0 已成为默认行为。详情请参阅 newline 形参的文档。
Python不依赖于底层操作系统的文本文件概念所有处理都由Python本身完成因此与平台无关。
缓冲策略
buffering 是用于设置缓冲策略的可选整数。规则有
缓冲是用于设置缓冲策略的可选整数。规则有
传递 0 以关闭缓冲仅在二进制模式下允许传递 1 以选择行缓冲仅在文本模式下可用传递大于1的整数以指示固定大小块缓冲区的字节大小如果取负值寄存区的缓冲大小则为系统默认
如果未给出缓冲参数使用默认的或者负值默认缓冲策略的工作方式如下
二进制文件缓冲在固定大小的块中; 缓冲区的大小使用启发式选择试图确定底层设备的默认缓冲区块大小block size和 回溯到io.DEFAULT_BUFFER_SIZE 和回溯到io。默认缓冲区大小。在许多系统上缓冲区的长度通常为4096或8192字节。“交互式”文本文件 satty() 返回 True的文件使用行缓冲。其他文本文件使用上述策略用于二进制文件。
错误处理
errors 是一个可选的字符串参数用于指定如何处理编码和解码错误 - 这不能在二进制模式下使用。可以使用各种标准错误处理程序列在 错误处理方案 但是使用 codecs.register_error() 注册的任何错误处理名称也是有效的。标准名称包括:
如果存在编码错误strict 会引发 ValueError 异常。 默认值 None 具有相同的效果。ignore 忽略错误。请注意忽略编码错误可能会导致数据丢失。replace 会将替换标记例如 ? 插入有错误数据的地方。surrogateescape 将把任何不正确的字节表示为 UDC80 至 UDCFF 范围内的下方替代码位。 当在写入数据时使用surrogateescape 错误处理句柄时这些替代码位会被转回到相同的字节。 这适用于处理具有未知编码格式的文件。只有在写入文件时才支持 xmlcharrefreplace。编码不支持的字符将替换为相应的XML字符引用 #nnn;。backslashreplace 用Python的反向转义序列替换格式错误的数据。namereplace 也只在编写时支持用 \N{...} 转义序列替换不支持的字符。
换行控制
newline 控制 universal newlines 模式如何生效它仅适用于文本模式。它可以是 None\n\r 和 \r\n。它的工作原理:
从流中读取输入时如果 newline 为 None则启用通用换行模式。输入中的行可以以 \n\r 或 \r\n 结尾这些行被翻译成 \n 在返回呼叫者之前。如果它是 则启用通用换行模式但行结尾将返回给调用者未翻译。如果它具有任何其他合法值则输入行仅由给定字符串终止并且行结尾将返回给未调用的调用者。将输出写入流时如果 newline 为 None则写入的任何 \n 字符都将转换为系统默认行分隔符 os.linesep。如果 newline 是 或 \n则不进行翻译。如果 newline 是任何其他合法值则写入的任何 \n 字符将被转换为给定的字符串。
文件对象
open() 函数所返回的 file object 类型取决于所用模式。 当使用 open() 以文本模式 (w, r, wt, rt 等) 打开文件时它将返回 io.TextIOBase (特别是 io.TextIOWrapper) 的一个子类。 当使用缓冲以二进制模式打开文件时返回的类是 io.BufferedIOBase 的一个子类。 具体的类会有多种在只读的二进制模式下它将返回 io.BufferedReader在写入二进制和追加二进制模式下它将返回 io.BufferedWriter而在读/写模式下它将返回 io.BufferedRandom。 当禁用缓冲时则会返回原始流即 io.RawIOBase 的一个子类 io.FileIO。
以下是一些常见的 file 对象常用方法
f.read([size])size 未指定则返回整个文件如果文件大小 2 倍内存则有问题f.read()读到文件尾时返回(空字串)。f.readline()返回一行。f.readlines([size]) 返回包含size行的列表, size 未指定则返回全部行。for line in f: print line 通过迭代器访问。f.write(hello\n)如果要写入字符串以外的数据,先将他转换为字符串。f.tell()返回一个整数,表示当前文件指针的位置(就是到文件头的字节数)。f.seek(偏移量,[起始位置])用来移动文件指针。 偏移量: 单位为字节可正可负起始位置: 0 - 文件头, 默认值; 1 - 当前位置; 2 - 文件尾f.close() 关闭文件 import osdir_fd os.open(somedir, os.O_RDONLY)def opener(path, flags):
... return os.open(path, flags, dir_fddir_fd)
...with open(spamspam.txt, w, openeropener) as f:
... print(This will be written to somedir/spamspam.txt, filef)
...os.close(dir_fd) # 不要泄露文件描述符 IO的类关系图
I/O 流被安排为按类的层次结构实现继承关系如下图 IO的基类
class io.IOBase
所有 I/O 类的抽象基类。
此类为许多方法提供了空的抽象实现派生类提供了具体的实现。
IOBase.close()
刷新并关闭此流。如果文件已经关闭则此方法无效。文件关闭后对文件的任何操作例如读取或写入都会引发 ValueError 。
IOBase.closed
如果流已关闭则返回 True。
IOBase.fileno()
返回流的底层文件描述符整数---如果存在。如果 IO 对象不使用文件描述符则会引发 OSError 。
IOBase.flush()
刷新流的写入缓冲区如果适用。这对只读和非阻塞流不起作用。
IOBase.isatty()
如果流是交互式的即连接到终端/tty设备则返回 True 。
IOBase.readable()
如果可以读取流则返回 True。 如果返回 False则 read() 将引发 OSError。
IOBase.readline(size- 1, /)
从流中读取并返回一行。如果指定了 size将至多读取 size 个字节。
对于二进制文件行结束符总是 b\n对于文本文件可以用将 newline 参数传给 open() 的方式来选择要识别的行结束符。
IOBase.readlines(hint- 1, /)
从流中读取并返回包含多行的列表。可以指定 hint 来控制要读取的行数如果以字节/字符数表示的所有行的总大小超出了 hint 则将不会读取更多的行。
0 或更小的 hint 值以及 None会被视为没有 hint。
请注意在不调用 file.readlines() 的情况下使用 for line in file: ... 来遍历文件对象已经成为可能。
IOBase.seek(offset, whenceos.SEEK_SET, /)
重新定位流的当前位置的偏移量whence指定偏移量的起始位置
os.SEEK_SET or 0 -- 流的开始位置 (默认值); 偏移量offset必须是非负整数0或正整数os.SEEK_CUR or 1 -- 流的当前位置;偏移量 offset可以是负整数os.SEEK_END or 2 -- 流结尾位置;偏移量offset通常是负整数
IOBase.seekable()
如果流支持随机访问重新定位当前位置则返回 True。 如为 False则 seek(), tell() 和 truncate() 将引发 OSError。
IOBase.tell()
返回当前流的位置。
IOBase.truncate(sizeNone, /)
将流的大小调整为给定的 size 个字节如果未指定 size 则调整至当前位置。 当前的流位置不变。 这个调整操作可扩展或减小当前文件大小。 在扩展的情况下新文件区域的内容取决于具体平台在大多数系统上额外的字节会填充为零。 返回新的文件大小。
在 3.5 版更改: 现在Windows在扩展时将文件填充为零。
IOBase.writable()
如果流支持写入则返回 True。 如为 False则 write() 和 truncate() 将引发 OSError。
IOBase.writelines(lines, /)
将行列表写入到流。 不会添加行分隔符因此通常所提供的每一行都带有末尾行分隔符。
IOBase.__del__()
为对象销毁进行准备。 IOBase 提供了此方法的默认实现该实现会调用实例的 close() 方法。 class io.RawIOBase
原始二进制流的基类。 它继承自 IOBase 。
原始二进制流通常会提供对下层 OS 设备或 API 的低层级访问而不是尝试将其封装到高层级的类中。
RawIOBase 在 IOBase 的现有成员以外还提供了下列方法:
RawIOBase.read(size- 1, /)
从对象中读取 size 个字节并将其返回。 作为一个便捷选项如果 size 未指定或为 -1则返回所有字节直到 EOF。 在其他情况下仅会执行一次系统调用。 如果操作系统调用返回字节数少于 size 则此方法也可能返回少于 size 个字节。
如果返回 0 个字节而 size 不为零 0这表明到达文件末尾。 如果处于非阻塞模式并且没有更多字节可用则返回 None。
默认实现会转至 readall() 和 readinto()。
RawIOBase.readall()
从流中读取并返回所有字节直到 EOF如有必要将对流执行多次调用。
RawIOBase.readinto(b, /)
将字节数据读入预先分配的可写 bytes-like object b并返回所读取的字节数。 例如b 可以是一个 bytearray。 如果对象处理非阻塞模式并且没有更多字节可用则返回 None。
RawIOBase.write(b, /)
将给定的 bytes-like object b 写入到下层的原始流并返回所写入的字节数。 这可以少于 b 的总字节数具体取决于下层原始流的设定特别是如果它处于非阻塞模式的话。 如果原始流设为非阻塞并且不能真正向其写入单个字节时则返回 None。 调用者可以在此方法返回后释放或改变 b因此该实现应该仅在方法调用期间访问 b。
class io.BufferedIOBase
支持某种缓冲的二进制流的基类。 它继承自 IOBase。
与 RawIOBase 的主要差别在于 read(), readinto() 和 write() 等方法将分别尝试按照要求读取尽可能多的输入或是耗尽所有给定的输出其代价是可能会执行一次以上的系统调用。
除此之外那些方法还可能引发 BlockingIOError如果下层的原始数据流处于非阻塞模式并且无法接受或给出足够数据的话不同于对应的 RawIOBase 方法它们将永远不会返回 None。
并且read() 方法也没有转向 readinto() 的默认实现。
典型的 BufferedIOBase 实现不应当继承自 RawIOBase 实现而要包装一个该实现正如 BufferedWriter 和 BufferedReader 所做的那样。
BufferedIOBase 在 IOBase 的现有成员以外还提供或重载了下列数据属性和方法:
BufferedIOBase.raw
由 BufferedIOBase 处理的下层原始流 (RawIOBase 的实例)。 它不是 BufferedIOBase API 的组成部分并且不存在于某些实现中。
BufferedIOBase.detach()
从缓冲区分离出下层原始流并将其返回。
在原始流被分离之后缓冲区将处于不可用的状态。
某些缓冲区例如 BytesIO 并无可从此方法返回的单独原始流的概念。 它们将会引发 UnsupportedOperation。
3.1 新版功能.
BufferedIOBase.read(size- 1, /)
读取并返回最多 size 个字节。 如果此参数被省略、为 None 或为负值则读取并返回所有数据直到 EOF。 如果流已经到达 EOF 则返回一个空的 bytes 对象。
如果此参数为正值并且下层原始流不可交互则可能发起多个原始读取以满足字节计数直至先遇到 EOF。 但对于可交互原始流则将至多发起一个原始读取并且简短的结果并不意味着已到达 EOF。
BlockingIOError 会在下层原始流不处于阻塞模式并且当前没有可用数据时被引发。
BufferedIOBase.read1(size- 1, /)
通过至多一次对下层流的 read() (或 readinto()) 方法的调用读取并返回至多 size 个字节。 这适用于在 BufferedIOBase 对象之上实现你自己的缓冲区的情况。
如果 size 为 -1 (默认值)则返回任意数量的字节多于零字节除非已到达 EOF。
BufferedIOBase.readinto(b, /)
将字节数据读入预先分配的可写 bytes-like object b 并返回所读取的字节数。 例如b 可以是一个 bytearray。
类似于 read()可能对下层原始流发起多次读取除非后者为交互式。
BlockingIOError 会在下层原始流不处于阻塞模式并且当前没有可用数据时被引发。
BufferedIOBase.readinto1(b, /)
将字节数据读入预先分配的可写 bytes-like object b其中至多使用一次对下层原始流 read() (或 readinto()) 方法的调用。 返回所读取的字节数。
BlockingIOError 会在下层原始流不处于阻塞模式并且当前没有可用数据时被引发。
3.5 新版功能.
BufferedIOBase.write(b, /)
写入给定的 bytes-like object b并返回写入的字节数 (总是等于 b 的字节长度因为如果写入失败则会引发 OSError)。 根据具体实现的不同这些字节可能被实际写入下层流或是出于运行效率和冗余等考虑而暂存于缓冲区。
当处于非阻塞模式时如果需要将数据写入原始流但它无法在不阻塞的情况下接受所有数据则将引发 BlockingIOError。
调用者可能会在此方法返回后释放或改变 b因此该实现应当仅在方法调用期间访问 b。
class io.FileIO
完整语法定义为
class io.FileIO(name, moder, closefdTrue, openerNone)
代表一个包含字节数据的 OS 层级文件的原始二进制流。 它继承自 RawIOBase。
name 可以是以下两项之一
代表将被打开的文件路径的字符串或 bytes 对象。 在此情况下 closefd 必须为 True (默认值) 否则将会引发异常。代表一个现有 OS 层级文件描述符的号码的整数作为结果的 FileIO 对象将可访问该文件。 当 FileIO 对象被关闭时此 fd 也将被关闭除非 closefd 设为 False。
mode 可以为 r, w, x 或 a 分别表示读取默认模式、写入、独占新建或添加。 如果以写入或添加模式打开的文件不存在将自动新建当以写入模式打开时文件将先清空。 以新建模式打开时如果文件已存在则将引发 FileExistsError。 以新建模式打开文件也意味着要写入因此该模式的行为与 w 类似。 在模式中附带 将允许同时读取和写入。
该类的 read() (当附带为正值的参数调用时), readinto() 和 write() 方法将只执行一次系统调用。
可以通过传入一个可调用对象作为 opener 来使用自定义文件打开器。 然后通过调用 opener 并传入 (name, flags) 来获取文件对象所对应的下层文件描述符。 opener 必须返回一个打开文件描述符传入 os.open 作为 opener 的结果在功能上将与传入 None 类似。
新创建的文件是 不可继承的。
在 3.3 版更改: 增加了 opener 参数。增加了 x 模式。
在 3.4 版更改: 文件现在禁止继承。
FileIO 在继承自 RawIOBase 和 IOBase 的现有成员以外还提供了以下数据属性和方法:
mode
构造函数中给定的模式。
name
文件名。当构造函数中没有给定名称时这是文件的文件描述符。
class io.BytesIO
缓冲流语法为
class io.BytesIO(initial_bytesb)
相比原始 I/O缓冲 I/O 流提供了针对 I/O 设备的更高层级接口。
一个使用内在字节缓冲区的二进制流。 它继承自 BufferedIOBase。 在 close() 方法被调用时将会丢弃缓冲区。
可选参数 initial_bytes 是一个包含初始数据的 bytes-like object。
import iostream_str io.BytesIO(bJournalDev Python: \x00\x01)
print(stream_str.getvalue())#bJournalDev Python: \x00\x01
BytesIO 在继承自 BufferedIOBase 和 IOBase 的成员以外还提供或重载了下列方法:
BytesIO.getbuffer()
返回一个对应于缓冲区内容的可读写视图而不必拷贝其数据。 此外改变视图将透明地更新缓冲区内容:
b io.BytesIO(babcdef)
view b.getbuffer()
view[2:4] b56
b.getvalue()
bab56ef
class io.BufferedReader
语法为
class io.BufferedReader(raw, buffer_sizeDEFAULT_BUFFER_SIZE)
一个提供对可读、不可查找的 RawIOBase 原始二进制流的高层级访问的缓冲二进制流。 它继承自 BufferedIOBase。
当从此对象读取数据时可能会从下层原始流请求更大量的数据并存放到内部缓冲区中。 接下来可以在后续读取时直接返回缓冲数据。
根据给定的可读 raw 流和 buffer_size 创建 BufferedReader 的构造器。 如果省略 buffer_size则会使用 DEFAULT_BUFFER_SIZE。
BufferedReader 在继承自 BufferedIOBase 和 IOBase 的成员以外还提供或重载了下列方法:
BufferedReader.peek(size0, /)
从流返回字节数据而不前移位置。 完成此调用将至多读取一次原始流。 返回的字节数量可能少于或多于请求的数量。
BufferedReader.read(size- 1, /)
读取并返回 size 个字节如果 size 未给定或为负值则读取至 EOF 或是在非阻塞模式下读取调用将会阻塞。
BufferedReader.read1(size- 1, /)
在原始流上通过单次调用读取并返回至多 size 个字节。 如果至少缓冲了一个字节则只返回缓冲的字节。 在其他情况下将执行一次原始流读取。
在 3.7 版更改: size 参数现在是可选的。
io.BufferedWriter
语法格式为
class io.BufferedWriter(raw, buffer_sizeDEFAULT_BUFFER_SIZE)
一个提供对可写、不可查找的 RawIOBase 原始二进制流的高层级访问的缓冲二进制流。 它继承自 BufferedIOBase。
当写入到此对象时数据通常会被放入到内部缓冲区中。 缓冲区将在满足某些条件的情况下被写到下层的 RawIOBase 对象包括:
当缓冲区对于所有挂起数据而言太小时当 flush() 被调用时当 seek() 被请求时针对 BufferedRandom 对象当 BufferedWriter 对象被关闭或销毁时。
该构造器会为给定的可写 raw 流创建一个 BufferedWriter。 如果未给定 buffer_size则使用默认的 DEFAULT_BUFFER_SIZE。
BufferedWriter 在继承自 BufferedIOBase 和 IOBase 的成员以外还提供或重载了下列方法:
BufferedWriter.flush()
将缓冲区中保存的字节数据强制放入原始流。 如果原始流发生阻塞则应当引发 BlockingIOError。
BufferedWriter.write(b, /)
写入 bytes-like object b 并返回写入的字节数。 当处于非阻塞模式时如果缓冲区需要被写入但原始流发生阻塞则将引发 BlockingIOError。
class io.BufferedRandom
语法为
class io.BufferedRandom(raw, buffer_sizeDEFAULT_BUFFER_SIZE) 一个提供对不可查找的 RawIOBase 原始二进制流的高层级访问的缓冲二进制流。 它继承自 BufferedReader 和 BufferedWriter。
该构造器会为在第一个参数中给定的可查找原始流创建一个读取器和写入器。 如果省略 buffer_size 则使用默认的 DEFAULT_BUFFER_SIZE。
BufferedRandom 能做到 BufferedReader 或 BufferedWriter 所能做的任何事。 此外还会确保实现 seek() 和 tell()。
class io.BufferedRWPair
语法为
class io.BufferedRWPair(reader, writer, buffer_sizeDEFAULT_BUFFER_SIZE, /) 一个提供对两个不可查找的 RawIOBase 原始二进制流的高层级访问的缓冲二进制流 --- 一个可读另一个可写。 它继承自 BufferedIOBase。
reader 和 writer 分别是可读和可写的 RawIOBase 对象。 如果省略 buffer_size 则使用默认的 DEFAULT_BUFFER_SIZE。
BufferedRWPair 实现了 BufferedIOBase 的所有方法但 detach() 除外调用该方法将引发 UnsupportedOperation。 文本IO
文本I/O预期并生成 str 对象。这意味着无论何时后台存储是由字节组成的例如在文件的情况下数据的编码和解码都是透明的并且可以选择转换特定于平台的换行符。
创建文本流的最简单方法是使用 open()可以选择指定编码
f open(myfile.txt, r, encodingutf-8)
内存中文本流也可以作为 StringIO 对象使用
f io.StringIO(some initial text data)
class io.TextIOBase
文本流的基类。 该类提供了基于字符和行的流 I/O 接口。 它继承自 IOBase。
TextIOBase 在来自 IOBase 的成员以外还提供以下数据属性和方法:
TextIOBase.encoding
用于将流的字节串解码为字符串以及将字符串编码为字节串的编码格式名称。
TextIOBase.errors
解码器或编码器的错误设置。
TextIOBase.newlines
一个字符串、字符串元组或者 None表示目前已经转写的新行。 根据具体实现和初始构造器旗标的不同此属性或许会不可用。
TextIOBase.read(size- 1, /)
从流中读取至多 size 个字符并以单个str的形式返回。 如果 size 为负值或 None则读取至 EOF。
TextIOBase.readline(size- 1, /)
读取至换行符或 EOF 并返回单个str。 如果流已经到达 EOF则将返回一个空字符串。, an empty string is returned.
TextIOBase.write(s, /)
将字符串 s 写入到流并返回写入的字符数。 class io.TextIOWrapper
class io.TextIOWrapper(buffer, encodingNone, errorsNone, newlineNone, line_bufferingFalse, write_throughFalse)
一个提供对 BufferedIOBase 缓冲二进制流的高层级访问的缓冲文本流。 它继承自 TextIOBase。
encoding 给出流的解码或编码要使用的编码格式的名称。 它默认为 locale.getencoding()。 encodinglocale 可被用来显式地指定当前语言区域的编码格式。 请参阅 文本编码格式 了解更多信息。errors 是一个可选的字符串它指明编码格式和编码格式错误的处理方式。 strict传入 strict 将在出现编码格式错误时引发 ValueError (默认值 None 具有相同的效果)ignore传入 ignore 将忽略错误。 (请注意忽略编码格式错误会导致数据丢失。)replace 会在出现错误数据时插入一个替换标记 (例如 ?)。backslashreplace 将把错误数据替换为一个反斜杠转义序列。 xmlcharrefreplace 替换为适当的 XML 字符引用namereplace (替换为 \N{...} 转义序列)。任何其他通过 codecs.register_error() 注册的错误处理方式名称也可以被接受。newline 控制行结束符处理方式。 它可以为 None, , \n, \r 和 \r\n。 其工作原理如下: 当从流读取输入时如果 newline 为 None则将启用 universal newlines 模式。 输入中的行结束符可以为 \n, \r 或 \r\n在返回给调用者之前它们会被统一转写为 \n。 如果 newline 为 也会启用通用换行模式但行结束符会不加转写即返回给调用者。 如果 newline 具有任何其他合法的值则输入行将仅由给定的字符串结束并且行结束符会不加转写即返回给调用者。将输出写入流时如果 newline 为 None则写入的任何 \n 字符都将转换为系统默认行分隔符 os.linesep。如果 newline 是 或 \n则不进行翻译。如果 newline 是任何其他合法值则写入的任何 \n 字符将被转换为给定的字符串。如果 line_buffering 为 True则当一个写入调用包含换行或回车符时将会应用 flush()。如果 write_through 为 True则对 write() 的调用会确保不被缓冲在 TextIOWrapper 对象上写入的任何数据会立即交给其下层的 buffer 来处理。
在 3.3 版更改: 已添加 write_through 参数
在 3.3 版更改: 默认的 encoding 现在将为 locale.getpreferredencoding(False) 而非 locale.getpreferredencoding()。 不要使用 locale.setlocale() 来临时改变区域编码格式要使用当前区域编码格式而不是用户的首选编码格式。
在 3.10 版更改: encoding 参数现在支持 locale 作为编码格式名称。
TextIOWrapper 在继承自 TextIOBase 和 IOBase 的现有成员以外还提供了以下数据属性和方法:
TextIOWrapper.line_buffering
是否启用行缓冲。
TextIOWrapper.write_through
写入是否要立即传给下层的二进制缓冲。
3.7 新版功能.
TextIOWrapper.reconfigure()
reconfigure(*, encodingNone, errorsNone, newlineNone, line_bufferingNone, write_throughNone) 使用 encoding, errors, newline, line_buffering 和 write_through 的新设置来重新配置此文本流。
未指定的形参将保留当前设定例外情况是当指定了 encoding 但未指定 errors 时将会使用 errorsstrict。
如果已经有数据从流中被读取则将无法再改变编码格式或行结束符。 另一方面在写入数据之后再改变编码格式则是可以的。
此方法会在设置新的形参之前执行隐式的流刷新。
3.7 新版功能.
在 3.11 版更改: 此方法支持 encodinglocale 选项。
class io.StringIO
class io.StringIO(initial_value, newline\n)
一个使用内存文本缓冲的文本流。 它继承自 TextIOBase。
当 close() 方法被调用时将会丢弃文本缓冲区。
缓冲区的初始值可通过提供 initial_value 来设置。 如果启用了换行符转写换行符将以与 write() 相同的方式进行编码。 流将被定位到缓冲区的起点这模拟了以 w 模式打开一个现有文件的操作使其准备好从头开始立即写入或是将要覆盖初始值的写入。 要模拟以 a 模式打开一个文件准备好追加内容请使用 f.seek(0, io.SEEK_END) 来将流重新定位到缓冲区的末尾。newline 参数的规则与 TextIOWrapper 所用的一致不同之处在于当将输出写入到流时如果 newline 为 None则在所有平台上换行符都会被写入为 \n。
StringIO 在继承自 TextIOBase 和 IOBase 的现有成员以外还提供了以下方法:
StringIO.getvalue()
返回一个 包含缓冲区全部内容的 str。 换行符会以与 read() 相同的方式被编码但是流位置不会改变。
用法示例:
import iooutput io.StringIO()
output.write(First line.\n)
print(Second line., fileoutput)# Retrieve file contents -- this will be
# First line.\nSecond line.\n
contents output.getvalue()# Close object and discard memory buffer --
# .getvalue() will now raise an exception.
output.close()
import iodata io.StringIO()
data.write(JournalDev: )
print(Python., filedata)print(data.getvalue()) #JournalDev: Python.data.close()input io.StringIO(This goes into the read buffer.)
print(input.read()) #This goes into the read buffer.