如何将bytes类型CSV数据写入文件?解决写入时的类型错误
解决Bytes格式CSV内容写入文件的问题
嘿,我太懂你这种绕弯路的感觉了!你手里已经是现成的、完整的CSV格式Bytes数据,根本不需要再用csv.writer去折腾——直接把这个Bytes对象写入文件就搞定了!
最直接的解决方案
你的数据已经是最终的CSV文件内容了,用二进制写入模式打开文件,直接写入Bytes就行:
# 你的Bytes格式CSV数据 csv_bytes = b'Date,ID,Amount\r\n2018-1-1,1,25\r\n2018-1-2,2,3\r\n2018-1-1,2,3\r\n' # 直接写入文件 with open('/Users/minhmai/test.csv', 'wb') as f: f.write(csv_bytes)
这样生成的文件就是带表头和3行数据的标准CSV,完全符合你的需求。
为什么之前的方法会出错?
咱们来捋捋你踩的坑:
- 用
csv.writer写入Bytes的问题:csv.writer的设计是接收字符串/列表形式的行数据,帮你转换成CSV格式。但你已经拿到了最终的CSV Bytes,再用它反而画蛇添足。而且wb模式下csv.writer会混淆数据类型,导致TypeError或_csv.Error。 - 用
io.StringIO的问题:StringIO是用来处理字符串的,你传入Bytes的话,它会把每个字节转成对应的ASCII数字(比如b'D'变成68),所以最终写入的都是数字,完全不是你要的CSV。
如果需要修改CSV内容再写入
要是你还需要对CSV数据做修改(比如调整某一行的值),那可以先把Bytes解码成字符串,再用csv模块处理:
import csv import io csv_bytes = b'Date,ID,Amount\r\n2018-1-1,1,25\r\n2018-1-2,2,3\r\n2018-1-1,2,3\r\n' # 先把Bytes解码成字符串(编码格式根据你的数据调整,比如utf-8、gbk) csv_str = csv_bytes.decode('utf-8') # 读取CSV行数据进行修改 rows = list(csv.reader(io.StringIO(csv_str))) rows[1][2] = '30' # 把第一行数据的Amount改成30 # 写入修改后的内容到文件 with open('/Users/minhmai/test.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerows(rows)
内容的提问来源于stack exchange,提问作者Minh
相关产品推荐
相关产品推荐

