Python3 流式字符串替换

Python3 streaming string replacement

我有一个 python3 “类文件对象”,其 read() 方法 returns 一个字符串 - 它来自打开的文件或从 [=12= 流式传输的对象] 使用 boto3.

我想在将流传递给 csv.DictReader 之前对其进行清理,特别是因为该模块在输入的 NUL 个字符上 barfs。

我正在处理的 CSV 文件可能很大,所以我想进行这种“流式传输”,而不是将整个 file/object 读入内存。

如何包装输入对象,以便我可以通过以下调用清理从 read() 返回的每个字符串:.replace('\x00', '{NUL}')?

我认为 io 库是值得关注的地方,但我找不到明显符合我要求的东西 - 能够拦截和转换对 .read() 的每次调用底层类文件对象并将包装器传递给 csv,而不是立即读取整个对象。

您可以使用简单的生成器函数在将数据传递给 csv.reader 之前修复数据:

import io
import csv


def denull(line_gen):
    for line in line_gen:
        yield line.replace('\x00', '{NUL}')


data = io.StringIO("""
hello;world
asdf;h\x00pla
""".strip())

for row in csv.reader(denull(data), delimiter=";"):
    print(row)

打印出来

['hello', 'world']
['asdf', 'h{NUL}pla']