如何在Python中将ibm037编码分隔符与UTF-8编码DataFrame写入同一文件
混合编码数据写入同一文件的解决方案
可行性说明
完全可行。文件本质是字节流,只要把不同编码的内容统一转换为字节,或是转成同一编码的字符串,就能写入同一文件。
现有代码的问题
你当前写法的核心错误:
- 把编码后的字节对象
Record_Header.encode("ibm037")直接转成字符串,得到的是类似b'2 '的文本,不是实际需要的字节内容 - 用文本模式打开文件,却试图混合字节和字符串写入,导致编码冲突
解决方案一:二进制模式写入(推荐,严格保留编码)
直接操作字节流,将ibm037编码的分隔符和UTF-8编码的行数据都转成字节后拼接写入:
from io import StringIO import pandas as pd # 测试数据准备 StringData = StringIO( """Date,Time 1,2 1,2 """ ) df_orig_data = pd.read_csv(StringData, sep=",") Record_Header = "@@@" # 你的目标分隔符 # 二进制模式打开文件(ab为追加二进制模式) with open("_All_DelimiterOfRecord.txt", "ab") as f: for _, row in df_orig_data.iterrows(): # 分隔符转成ibm037编码的字节 header_bytes = Record_Header.encode("ibm037") # 行数据转成UTF-8编码的字节,制表符分隔 row_str = "\t".join([str(row["Date"]), str(row["Time"])]) + "\n" row_bytes = row_str.encode("utf-8") # 拼接字节并写入 f.write(header_bytes + b"\t" + row_bytes)
解决方案二:统一转成UTF-8字符串写入
如果分隔符@@@在ibm037中的字符能被UTF-8正确表示(实际@@@在两种编码中是相同字符),可以先把ibm037编码的字节解码为Unicode字符串,再和DataFrame内容一起按UTF-8写入:
from io import StringIO import pandas as pd # 测试数据准备 StringData = StringIO( """Date,Time 1,2 1,2 """ ) df_orig_data = pd.read_csv(StringData, sep=",") Record_Header = "@@@" # 将ibm037编码的分隔符解码为Unicode字符串 header_str = Record_Header.encode("ibm037").decode("ibm037") # 文本模式打开文件,指定UTF-8编码 with open("_All_DelimiterOfRecord.txt", "a", encoding="utf-8") as f: for _, row in df_orig_data.iterrows(): # 拼接字符串并写入 line = "\t".join([header_str, str(row["Date"]), str(row["Time"])]) + "\n" f.write(line)
注意事项
- 优先用
with语句管理文件,避免手动关闭时的异常 - 若分隔符是特殊字符,为避免乱码,优先选择二进制模式写入以严格保留原始编码字节
内容的提问来源于stack exchange,提问作者Curious_Insider
相关产品推荐
相关产品推荐

