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

如何使用pandas read_fwf处理含日文字符的定宽数据

解决pandas.read_fwf处理SHIFT-JIS编码双字节定宽文件的问题

问题根源

pd.read_fwf()的widths参数是按Unicode字符数计算分割位置的,但你的文件是按字节数定义固定宽度的。在SHIFT-JIS编码下,日文汉字、假名等字符占2字节,导致字符数和字节数不匹配,最终分割结果不符合预期。pandas的文本读取函数(包括read_fwf)都是基于解码后的字符流处理,无法直接识别原始字节的宽度规则。

原生pandas兼容的解决方案

虽然没有直接的read_fwf参数支持按字节分割,但可以通过先处理原始字节流,再用pandas构造DataFrame的方式实现,避免编写完整的自定义解析器:

import pandas as pd

# 定义字节级的宽度规则(和需求一致:1,3,22,5,1)
byte_widths = [1, 3, 22, 5, 1]
encoding = "SHIFT-JIS"

# 读取原始字节流并按字节宽度分割
rows = []
# 替换为你的实际文件路径
with open("your_file.txt", "rb") as f:
    for line in f:
        line = line.strip()  # 去除换行符等空白字节
        if not line:
            continue
        start = 0
        fields = []
        for w in byte_widths:
            end = start + w
            # 截取对应字节段并解码为字符串,同时去除首尾空白
            field = line[start:end].decode(encoding).strip()
            fields.append(field)
            start = end
        rows.append(fields)

# 转换为DataFrame
df = pd.DataFrame(rows, columns=["col1", "col2", "name", "col4", "col5"])
print(df)

代码说明

  1. 以二进制模式读取文件,保留原始字节信息,确保按字节宽度分割的准确性;
  2. 对每行字节按定义的宽度切片,解码为SHIFT-JIS字符串后去除首尾空白;
  3. 将处理后的行数据传入pd.DataFrame,直接得到符合预期的结构化数据。

内容的提问来源于stack exchange,提问作者blue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:50:35