如何将 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 = ''
来防止这种情况。
首先,我了解如何从 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 = ''
来防止这种情况。