Python 3.x 从字节流中读取utf-8字符
给定字节流(生成器、文件等),如何读取单个Python 3.x 从字节流中读取utf-8字符,python-3.x,utf-8,utf8-decode,Python 3.x,Utf 8,Utf8 Decode,给定字节流(生成器、文件等),如何读取单个utf-8编码字符 此操作必须使用流中该字符的字节 此操作不得使用超过第一个字符的任何字节 此操作应在任何Unicode字符上成功 我可以通过滚动我自己的utf-8解码功能来实现这一点,但我不想重新发明轮子,因为我确信这个功能必须已经在其他地方用于解析utf-8字符串。用encoding='utf8'将流包装成一个字符串,然后调用.read(1) 这是假设您从一个或与之兼容的duck类型开始(即有一个read()方法)。如果您有生成器或迭代器,则可能
utf-8
编码字符
- 此操作必须使用流中该字符的字节
- 此操作不得使用超过第一个字符的任何字节
- 此操作应在任何Unicode字符上成功
utf-8
解码功能来实现这一点,但我不想重新发明轮子,因为我确信这个功能必须已经在其他地方用于解析utf-8
字符串。用encoding='utf8'
将流包装成一个字符串,然后调用.read(1)
这是假设您从一个或与之兼容的duck类型开始(即有一个read()
方法)。如果您有生成器或迭代器,则可能需要调整接口
例如:
from io import TextIOWrapper
with open('/path/to/file', 'rb') as f:
wf = TextIOWrapper(f, 'utf-8')
wf._CHUNK_SIZE = 1 # Implementation detail, may not work everywhere
wf.read(1) # gives next utf-8 encoded character
f.read(1) # gives next byte
TextIOWrapper
是否进行任何缓冲(从而消耗超过第一个字符的字节)?如果我取一个文件f
并将其包装wrapped=TextIOWrapper(f,'utf-8')
,调用wrapper.read(1)
,然后再调用f.read(1)
读取一个字节,该字节比紧跟在utf-8字符后面的字节要远得多。@arcyqwerty:TextIOWrapper
一次读取2k字节(\u块大小
)。它消耗的字节数超过了第一个字符所需的字节数。或者,是否有方法从包装器TextIOWrapper
获取原始字节?在这种情况下,它似乎违反了。此操作不得消耗流中超过第一个字符的任何字节。
是否有办法禁用缓冲?@arcyqwerty:set\u CHUNK\u SIZE=1
?