【问题标题】:How to assign data from a file to a dictionary?如何将文件中的数据分配给字典?
【发布时间】:2021-12-29 16:29:58
【问题描述】:

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

% 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

我希望代码返回字典{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)

【问题讨论】:

  • 您是否尝试过可能表明您遇到问题的级别?没有这个就很难得到合适的答案。例如,您知道如何打开文件吗?你知道如何遍历文件吗?你知道如何构造任何Dict吗?
  • 这是一种不方便的格式。这个文件是从哪里来的?您可能希望先生成一个更易于解析的文件(例如 JSON 或 CSV)。
  • @L.Grozinger 已编辑
  • 你不能像这样将数据解压到key, value。尝试类似split_value = line.split(":") 然后header[split_value[0]] = split_value[1]
  • 然后我得到了IndexError: list index out of range

标签: python file dictionary


【解决方案1】:

语法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()s 有两个以上的值,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'}

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

【讨论】:

    【解决方案2】:
    • ':' 上拆分,因为这就是将键与值区分开来的原因。
    • 确保不要尝试拆分/解析 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'}
    

    【讨论】:

      猜你喜欢
      • 2021-09-11
      • 2015-06-23
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      相关资源
      最近更新 更多