如何将 UTF-8 CSV 写入 Python3 中的 BytesIO?

How to write UTF-8 CSV into BytesIO in Python3?

首先,我了解如何从 Python3 中的字符串编写 UTF-8,并且建议使用 StringIO 构建此类字符串。但是,我特别需要一个 binary 类文件对象,为此我需要 BytesIO。如果我执行以下操作,那么数据最终会爆炸,因为它被读取为 Latin1,我计算机的默认设置 locale/charset.

with io.StringIO() as sb:
    csv.writer(sb).writerows(rows)
    sb.flush()
    sb.seek(0)
    # blows up with Latin1 encoding error
    job = bq.load_table_from_file(sb, table_ref, job_config=job_config)

所以我的解决方法是将使用的内存量加倍:

with io.StringIO() as sb:
    csv.writer(sb).writerows(rows)
    sb.flush()
    sb.seek(0)
    with io.BytesIO(sb.getvalue().encode('utf-8')) as buffer:
        job = bq.load_table_from_file(buffer, table_ref, job_config=job_config)

在此链中的某处必须是一种指定字节编码的方法,以便文件类sb的读者将看到数据为UTF- 8.或者有没有办法将 csv.writer() 与字节流一起使用?

我在 Whosebug 上寻找了这两个答案,但我发现的通常是写入文件和内存中的内容,所有内容都指向 StringIO

有一个 TextIOWrapper class 可以完成这项工作,但如果您使用上下文管理器 with 它就会 关闭 流式传输并使原始 BytesIO 对象不可用。

修改我原来的例子:

with io.BytesIO() as buffer:
    sb = io.TextIOWrapper(buffer, 'utf-8', newline='')
    csv.writer(sb).writerows(rows)
    sb.flush()
    buffer.seek(0)
    job = bq.load_table_from_file(buffer, table_ref, job_config=job_config)

另一个警告是 newline 参数,如果单独使用,它会转换换行符。设置 newline = '' 来防止这种情况。