按字符位置解析含Unicode字符的固定宽度列文本行问题咨询
你遇到的偏移问题核心是struct模块操作的是字节序列,按字节数截取内容,而多字节Unicode字符的字节数和字符数不对等,所以会出现错位。你提到用字符串切片也遇到问题,大概率是当时操作的是encode后的bytes对象,bytes的切片按字节计数,只要操作的是解码后的str类型就不会有这个问题。
解决方案
Python中str类型本身就是Unicode字符序列,对str做切片默认就是按字符数计数,完全符合你的需求,不需要依赖struct模块。
示例代码
# 你的原始行(已经是str类型) line = '00041235957A CORU¥A ABC\n' # 定义每列的字符长度,和你要求的规则完全一致 col_widths = [4, 7, 15, 3] # 预计算每个列的切片区间,处理多行时可以只计算一次提升效率 slices = [] offset = 0 for width in col_widths: slices.append(slice(offset, offset + width)) offset += width # 解析单行的方法 def parse_fixed_line(line: str) -> tuple: # 不需要去列尾空格的话,去掉.rstrip()即可 return tuple(line[s].rstrip() for s in slices) # 测试输出 print(parse_fixed_line(line))
输出结果
('0004', '1235957', 'A CORU¥A', 'ABC')
注意事项
- 读取文件时请使用文本模式打开并指定正确编码,例如
open("data.txt", "r", encoding="utf-8"),读出来的每一行天然是str类型,无需手动解码。 - 如果你拿到的内容是
bytes类型,请先调用.decode(对应编码)转为str后再做切片,不要直接对bytes做切片操作。
内容的提问来源于stack exchange,提问作者SAS2Python
相关产品推荐
相关产品推荐

