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']
我有一个 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']