【问题标题】:Python3 streaming string replacementPython3 流式字符串替换
【发布时间】:2021-12-17 00:21:48
【问题描述】:

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

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

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

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

我认为 io 库是可以查看的地方,但我找不到明显符合我要求的东西 - 能够拦截和转换对底层类文件对象的 .read() 的每次调用并将包装器传递给csv,而不是一次阅读整个内容。

【问题讨论】:

    标签: python csv stringio


    【解决方案1】:

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

    【讨论】:

    • 我得到 object is not iterable - 我猜 csv.DictReader 需要一个 Iterable[str] 对象 - 我该如何实现?
    • 啊,是的,刚刚用csv 尝试过。只需一秒钟,这将变得更加容易:)
    猜你喜欢
    • 2021-12-23
    • 2012-04-26
    • 2017-04-28
    • 2017-10-14
    • 1970-01-01
    • 2015-01-21
    • 2015-11-14
    • 2018-07-13
    • 1970-01-01
    相关资源
    最近更新 更多