Python保存CSV文件时的编码异常与格式错误问题求解
解决Python写入含bytes元素列表到CSV的问题
错误原因分析
- 字符串被拆分为单独列:
writerows(row)用法错误。writerows要求传入行的序列(比如[[列1,列2], [列3,列4]]),如果直接传入单个字符串或一维列表,它会把每个字符/元素当成单独列,最终导致拆分问题。 - bytes内容编码异常:CSV写入器仅支持字符串类型,直接写入bytes对象会引发编码混乱,必须先将bytes解码为字符串。
正确实现步骤
- 转换bytes为字符串:遍历列表元素,将bytes类型解码为utf-8字符串(若bytes采用其他编码,替换对应编码值即可)。
- 规范CSV写入格式:确保传入
writerow/writerows的是正确二维结构——单行数据用writerow,多行数据用writerows。
示例代码
import csv # 假设原始数据为含bytes的列表(单行/多行均可) # 单行示例 data = [b'张三', '25', b'工程师', b'北京'] # 多行示例:data = [[b'张三', '25'], [b'李四', '30']] # 处理bytes元素,统一转为字符串 processed_data = [] for item in data: if isinstance(item, bytes): processed_data.append(item.decode('utf-8')) else: processed_data.append(item) # 写入CSV文件 with open('salva.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) # 写入单行数据 writer.writerow(processed_data) # 若为多行数据,替换为: # writer.writerows(processed_data)
额外注意事项
newline=''是csv模块推荐写法,会让模块自动处理换行符,避免跨平台换行问题,不要手动设置newline='\n'。- 若数据包含逗号、引号等特殊字符,可设置
quoting=csv.QUOTE_ALL让写入器自动给所有字段加引号,避免列拆分错误:
writer = csv.writer(f, quoting=csv.QUOTE_ALL)
内容的提问来源于stack exchange,提问作者user2019215
相关产品推荐
相关产品推荐

