如何将文件中的数据分配给字典?

How to assign data from a file to a dictionary?

我刚刚开始我的编码冒险。我的问题是我有一个结构为:

的文件
% program   : RTKPOST 
% pos mode  : ppp-static
% solution  : forward
% elev mask : 10.0 deg
% dynamics  : off
% tidecorr  : off
% tropo opt : saastamoinen
% ephemeris : broadcast
% ====================================  END OF HEADER

并且我想要 return 字典的代码 {program: "RTKPOST", pos_mode : "ppp-static"}

我正在尝试:

data = []
header = {}

with open("file.txt") as file:
    for line in file:
        if line.startswith("%"):
            key, val = line.split()
            header[key] = val
        else:
            data.append(line.split())

并得到:

ValueError: too many values to unpack (expected 2)
  • ':' 上拆分,因为这是您的键与值的区别。
  • 确保不要尝试 split/parse 那 END OF HEADER 行。
data = []
header = {}

with open("file.txt") as file:
    for line in file:
        if line.startswith("% =="):
            break
        if not line.startswith("%"):
            data.append(line.split())
            continue
        key, val = map(str.strip, line[1:].split(':'))
        header[key] = val

print(header)

打印:

{'program': 'RTKPOST', 'pos mode': 'ppp-static', 'solution': 'forward', 'elev mask': '10.0 deg', 'dynamics': 'off', 'tidecorr': 'off', 'tropo opt': 'saastamoinen', 'ephemeris': 'broadcast'}

语法 x, y = z 可用于使用 z 中的值分配给 xy,但它期望 z 具有可用值的正确数量(在本例中为 2)。这有效,例如

>>> x, y = [1, 2]
>>> x
1
>>> y
2

但这不是:

>>> x, y = [1, 2, 3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)

由于您的每个 line.split() 都有超过 2 个值,因此 key, val = line.split() 将始终产生此错误。问题是,例如文件的最后一行不遵循与第一行相同的规则。一般来说,这种方法不会很稳健。

我建议改用正则表达式来挑选你想要的键值对。这样你就可以方便的指定文件中键值对的格式,并方便的从整个文件中提取出来,以后如果格式发生变化,只需要修改正则表达式即可。

我建议正则表达式:

header_property = r'^% (.+):(.+)$'

要解释此正则表达式,请查看 re docs。简而言之,这将匹配以 % 开头的行,后跟一个或多个字符的字符串,中间有 :

使用它的完整示例如下:

import re
header_property = r'^% (.+):(.+)$'

header = {}

with open("file.txt") as file:
    for line in file:
        match = re.search(header_property, line)
        if match is not None:
            key = match.group(1).strip()
            value = match.group(2).strip()
            header[key] = value

之后 header 将是

>>> header
{'program': 'RTKPOST', 'pos mode': 'ppp-static', ..., 'ephemeris': broadcast'}

几乎可以使用正则表达式从文本文件中提取任何内容。值得学习一下如何使用它们。