首先,我了解如何在Python3中从字符串编写UTF-8,并且建议使用StringIO
进行此类字符串构建。但是,我需要一个特定的二进制文件对象,因此我需要使用BytesIO
。如果我按照以下方式进行,则数据最终会膨胀,因为它被读取为Latin1,这是我的电脑默认的区域设置/字符集。
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()
与字节流一起使用?我在StackOverflow上寻找了这两个答案,但我所找到的通常是关于写入文件和内存中的东西,而所有的指向都是
StringIO
。