如何创建和写入 textiowrapper 和 readlines
How to create and write to a textiowrapper and readlines
所以我正在尝试创建一个文本 io 包装器,然后我可以使用 readlines() 进行单元测试。这是我的尝试,但是当我 运行 它时 readlines() returns 什么都没有:
output = io.BytesIO()
wrapper = io.TextIOWrapper(
output,
encoding='cp1252',
line_buffering=True,
)
wrapper.write('Text1')
wrapper.write('Text2')
wrapper.write('Text3')
wrapper.write('Text4')
for line in wrapper.readlines():
print(line)
我需要更改什么才能获得此输出:
Text1
Text2
Text3
Text4
阅读 io
模块文档中的 TextIOWrapper
class:
A buffered text stream over a BufferedIOBase
binary stream.
编辑:使用seek
函数:
seek(offset[, whence])
Change the stream position to the given byte offset. offset
is
interpreted relative to the position indicated by whence
. The default
value for whence
is SEEK_SET
. Values for whence
are:
SEEK_SET
or 0 – start of the stream (the default); offset should be zero or positive
SEEK_CUR
or 1 – current stream position; offset may be negative
SEEK_END
or 2 – end of the stream; offset is usually negative
Return the new absolute position.
New in version 3.1: The SEEK_*
constants.
New in version 3.3: Some operating systems could support additional
values, like os.SEEK_HOLE
or os.SEEK_DATA
. The valid values for a
file could depend on it being open in text or binary mode.
尝试以下评论代码段:
import io, os
output = io.BytesIO()
wrapper = io.TextIOWrapper(
output,
encoding='cp1252',
# errors=None, # defalut
# newline=None, # defalut
line_buffering=True,
# write_through=False # defalut
)
wrapper.write('Text1\n')
wrapper.write('Text2\n')
wrapper.write('Text3\n')
# wrapper.flush() # If line_buffering is True, flush() is implied
## when a call to write contains a newline character.
wrapper.seek(0,0) # start of the stream
for line in wrapper.readlines():
print(line)
我原来的答案的其余部分:
print(output.getvalue()) # for gebugging purposes
print( wrapper.write('Text4\n')) # for gebugging purposes
# for line in wrapper.read():
for line in output.getvalue().decode('cp1252').split(os.linesep):
print(line)
输出:
==> D:\test\Python\q44702487.py
b'Text1\r\nText2\r\nText3\r\n'
6
Text1
Text2
Text3
Text4
==>
所以我正在尝试创建一个文本 io 包装器,然后我可以使用 readlines() 进行单元测试。这是我的尝试,但是当我 运行 它时 readlines() returns 什么都没有:
output = io.BytesIO()
wrapper = io.TextIOWrapper(
output,
encoding='cp1252',
line_buffering=True,
)
wrapper.write('Text1')
wrapper.write('Text2')
wrapper.write('Text3')
wrapper.write('Text4')
for line in wrapper.readlines():
print(line)
我需要更改什么才能获得此输出:
Text1
Text2
Text3
Text4
阅读 io
模块文档中的 TextIOWrapper
class:
A buffered text stream over a
BufferedIOBase
binary stream.
编辑:使用seek
函数:
seek(offset[, whence])
Change the stream position to the given byte offset.
offset
is interpreted relative to the position indicated bywhence
. The default value forwhence
isSEEK_SET
. Values forwhence
are:
SEEK_SET
or 0 – start of the stream (the default); offset should be zero or positiveSEEK_CUR
or 1 – current stream position; offset may be negativeSEEK_END
or 2 – end of the stream; offset is usually negativeReturn the new absolute position.
New in version 3.1: The
SEEK_*
constants.New in version 3.3: Some operating systems could support additional values, like
os.SEEK_HOLE
oros.SEEK_DATA
. The valid values for a file could depend on it being open in text or binary mode.
尝试以下评论代码段:
import io, os
output = io.BytesIO()
wrapper = io.TextIOWrapper(
output,
encoding='cp1252',
# errors=None, # defalut
# newline=None, # defalut
line_buffering=True,
# write_through=False # defalut
)
wrapper.write('Text1\n')
wrapper.write('Text2\n')
wrapper.write('Text3\n')
# wrapper.flush() # If line_buffering is True, flush() is implied
## when a call to write contains a newline character.
wrapper.seek(0,0) # start of the stream
for line in wrapper.readlines():
print(line)
我原来的答案的其余部分:
print(output.getvalue()) # for gebugging purposes
print( wrapper.write('Text4\n')) # for gebugging purposes
# for line in wrapper.read():
for line in output.getvalue().decode('cp1252').split(os.linesep):
print(line)
输出:
==> D:\test\Python\q44702487.py
b'Text1\r\nText2\r\nText3\r\n'
6
Text1
Text2
Text3
Text4
==>