如何去除base64.b64encode导出CSV后出现的多余换行?
问题
我正在使用base64对二进制图片文件进行编码,代码如下:
with open("33111117789.jpg", "rb") as image_file: encoded_string = base64.b64encode(image_file.read())
根据Python 3.8官方文档,我预期该方法返回不含换行的bytes对象,但将编码结果导出到CSV文件后出现了多余换行,导出代码如下:
# Update to csv dateNow = datetime.datetime.today().strftime('%d.%m.%Y') data = ["1", dateNow, "+33111117789", encoded_string] with open('output.csv', 'a', encoding='utf-8-sig', newline='') as f: writer = csv.writer(f, delimiter=';', lineterminator='\n') writer.writerow(data)
预期结果应为单行,但实际出现多行换行。我尝试过base64.encode()和base64.b64encode(),结果一致。另外注意到每个换行前都有+号,请问是否用错了base64函数或遗漏了参数?+号是否需要去除?
解决方案
问题根源
换行问题和+号无关,核心原因是直接将bytes类型的base64编码结果传入了csv.writer。CSV写入器会把bytes对象当作可迭代对象处理,逐个字节写入时,若遇到对应ASCII换行符的字节就会自动换行;而+是base64编码的合法字符,完全不需要去除。
解决步骤
- 将bytes转成字符串:把
base64.b64encode返回的bytes对象解码为UTF-8字符串,避免CSV写入器迭代单个字节:encoded_string = base64.b64encode(image_file.read()).decode('utf-8') - 完整修正代码:保留你原有的CSV写入参数(
newline=''和lineterminator='\n'设置合理),修改后的完整代码如下:import base64 import datetime import csv # 编码图片 with open("33111117789.jpg", "rb") as image_file: encoded_string = base64.b64encode(image_file.read()).decode('utf-8') # 写入CSV dateNow = datetime.datetime.today().strftime('%d.%m.%Y') data = ["1", dateNow, "+33111117789", encoded_string] with open('output.csv', 'a', encoding='utf-8-sig', newline='') as f: writer = csv.writer(f, delimiter=';', lineterminator='\n') writer.writerow(data)
额外说明
base64.b64encode本身不会生成换行符,问题出在bytes对象的处理逻辑上,而非编码函数本身。+是base64标准中用来替代/的合法字符,删除会导致后续解码失败,绝对不能随意去除。
内容的提问来源于stack exchange,提问作者Kayden Khim
相关产品推荐
相关产品推荐

