You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:15:43