首页 > 解决方案 > Python3 流式字符串替换

问题描述

我有一个 python3“类文件对象”,它的read()方法返回一个字符串 - 它来自打开的文件或从s3using流式传输的对象boto3

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

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

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

我认为io图书馆是看的地方,但我找不到明显做了我想要的东西 - 能够拦截和转换.read()对底层类文件对象的每次调用并将包装器传递给csv,而无需阅读整个事情一次。

标签: pythoncsvstringio

解决方案


您可以使用一个简单的生成器函数来修复数据,然后再将其传递给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']

推荐阅读