如何使用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)
代码说明
- 以二进制模式读取文件,保留原始字节信息,确保按字节宽度分割的准确性;
- 对每行字节按定义的宽度切片,解码为SHIFT-JIS字符串后去除首尾空白;
- 将处理后的行数据传入
pd.DataFrame,直接得到符合预期的结构化数据。
内容的提问来源于stack exchange,提问作者blue
相关产品推荐
相关产品推荐

