Python读取格式化字符串

2024-05-15 22:46:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件,其中有许多行的格式如下:

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实现的模块,或者其他干净的方式?

谢谢!


Tags: 文件idfielddata格式type方式position
3条回答

看起来你可以用字符串和切片简单地编写一个函数。字符串[0:5]将是第一个元素。它需要可扩展,还是可能是一次性的?

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

请参阅struct module文档。在我看来你想用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)

我想我从你的问题/评论中明白你在找什么。如果我们假设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)

结果应该包含一个字典列表,其中每个字典都是从格式文件中的键名到正确数据类型中的数据值的映射。

相关问题 更多 >