Python 读取格式化字符串

8 投票
3 回答
33767 浏览
提问于 2025-04-16 23:53

我有一个文件,里面有很多行,格式是这样的:

FIELD      POSITION  DATA TYPE
------------------------------
COOP ID       1-6    Character
LATITUDE     8-15    Real
LONGITUDE   17-25    Real
ELEVATION   27-32    Real
STATE       34-35    Character
NAME        37-66    Character
COMPONENT1  68-73    Character
COMPONENT2  75-80    Character
COMPONENT3  82-87    Character
UTC OFFSET  89-90    Integer

这些数据都是用ASCII格式写的。

举个例子,一行的内容是:

011084  31.0581  -87.0547   26.0 AL BREWTON 3 SSE                  ------ ------ ------ +6

我现在的想法是,我想一行一行地读取这个文件,并且以某种方式把每一行分成一个字典,这样我就可以方便地访问里面的各个部分。有没有什么模块可以在Python中做到这一点,或者有什么其他简单的方法呢?

谢谢!

3 个回答

0

看起来你可以很简单地用字符串和切片来写一个函数。比如说,string[0:5] 就是取字符串的前五个字符。你需要这个功能可以扩展吗?还是说这只是一次性的需求?

1

我觉得从你的问题和评论中,我明白你想要什么了。如果我们假设只有实数(Real)、字符(Character)和整数(Integer)这三种数据类型,那么下面的代码应该可以正常运行。(我还假设你展示的格式文件是用制表符分隔的):

format = {}
types = {"Real":float, "Character":str, "Integer":int}

for line in open("format.txt", "r"):
    values = line.split("\t")
    range = values[1].split("-")
    format[values[0]]={"start":int(range[0])-1, "end":int(range[1])-1, "type":types[values[2]]}

results=[]
for line in open("filename.txt"):
    result={}
    for key in format:
        result[key]=format["type"](line[format["start"]:format["end"]])
    results.append(result)

最终你会得到一个结果,里面包含一个字典的列表,每个字典都是把格式文件中的键名和对应的数据值按正确的数据类型进行映射。

16

编辑: 你仍然可以使用结构体模块:

查看 结构体模块 的文档。看起来你想用 struct.unpack()

你可能想要的东西大概是这样的:

import struct
with open("filename.txt", "r") as f:
    for line in f:
        (coop_id, lat, lon, elev, state, name, c1, c2, c3, utc_offset
         ) = struct.unpack("6sx8sx9sx6sx2sx30sx6sx6sx6sx2s", line.strip())
        (lat, lon, elev) = map(float, (lat, lon, elev))
        utc_offset = int(utc_offset)

撰写回答