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

Python是否有类似Perl的pack/unpack方法用于结构化文件解析?

嘿,这个问题问得好!Python里确实有能替代Perl pack/unpack的工具,最常用的就是内置的struct模块,另外还有几种更适合纯文本场景的方法,我给你拆解说明下~

内置struct模块:最接近Perl的unpack

struct模块是Python官方内置的工具,原本用于处理二进制数据,但对于你这种固定宽度的文本格式也完全适用,用法和Perl的unpack非常相似。

对应你Perl里的模板"A10xA27xA7",我们可以转换成struct的格式字符串:

  • A10 → 10s:表示10字节的ASCII字符串(struct处理字符串需要先编码为字节,提取后再解码并去掉多余空格)
  • x → x:跳过一个字节/字符
  • A27 → 27s:27字节的ASCII字符串
  • x → x:再跳过一个字符
  • A7 → 7s:7字节的ASCII字符串

用你的示例内容写代码的话,就是这样:

import struct

# 假设你的行内容是固定宽度的格式(和Perl处理的输入一致)
line = "01/28/2001 Flea spray               24.99     "
# 先编码为ASCII字节,再用unpack提取
date_bytes, desc_bytes, income_bytes = struct.unpack('10s x 27s x 7s', line.encode('ascii'))
# 解码并去除多余空格
date = date_bytes.decode('ascii').strip()
desc = desc_bytes.decode('ascii').strip()
income = income_bytes.decode('ascii').strip()

print(date)    # 输出: 01/28/2001
print(desc)    # 输出: Flea spray
print(income)  # 输出: 24.99
直接字符串切片:简单直观的纯文本处理

如果你的场景只是纯文本固定宽度分割,完全可以不用任何模块,直接用Python的字符串切片,写法更直观:

line = "01/28/2001 Flea spray               24.99     "
# 对应Perl模板的A10(0-9位),跳过1位(第10位),然后A27(11-37位),再跳过1位(38位),最后A7(39-45位)
date = line[0:10].strip()
desc = line[11:38].strip()
income = line[39:46].strip()

print(date)    # 输出: 01/28/2001
print(desc)    # 输出: Flea spray
print(income)  # 输出: 24.99
第三方库parse:更灵活的模板语法

如果你想要更接近Perl那种简洁的模板写法,可以用第三方库parse(需要先通过pip install parse安装),它支持用类似的格式定义来提取内容,写法更简洁:

from parse import parse

line = "01/28/2001 Flea spray               24.99     "
# 用{:10}表示10宽度的字段,以此类推
result = parse("{:10} {:27} {:7}", line)
date, desc, income = [item.strip() for item in result]

print(date)    # 输出: 01/28/2001
print(desc)    # 输出: Flea spray
print(income)  # 输出: 24.99

总结一下

  • 如果需要和二进制数据交互,或者追求和Perl unpack一致的风格,选struct模块;
  • 如果只是纯文本固定宽度分割,直接用字符串切片最省事;
  • 要是想要更灵活的模板语法,parse库会是不错的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:18:12