如何将文件中的数据分配给字典?
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
中的值分配给 x
和 y
,但它期望 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'}
几乎可以使用正则表达式从文本文件中提取任何内容。值得学习一下如何使用它们。
我刚刚开始我的编码冒险。我的问题是我有一个结构为:
的文件% 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
中的值分配给 x
和 y
,但它期望 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'}
几乎可以使用正则表达式从文本文件中提取任何内容。值得学习一下如何使用它们。