我有一个文本文件,其中包含以下变量及其值。
COM 0.95958 eh 26.9817 ehc 26.9817 ehoff 0 ew 0.181982 ewoff -0.00400919 oeh 429.788 sp_icr 15.3199 sp_il -11.4382 sp_pdelay -1.53578e-09 sp_pk_icr 15.0735 sp_pk_icr_f 7.81609e+09 sp_pk_il -12.2937 sp_pk_il_f 7.71614e+09 sp_pk_ild 3.05223 sp_pk_ild_f 7.3963e+08 sp_pk_rxrl -0.0909508 sp_pk_rxrl_f 3.01849e+09 sp_pk_txrl -6.33623 sp_pk_txrl_f 6.5967e+08 sp_rxrl -0.187543 sp_txrl -19.2629
如何仅提取特定变量及其相应值?如何提取 COM及其值以及 ehc及其值?
for filename in glob.glob(os.path.join(path, '*.log')):
with open(filename, 'rt') as in_file:
str = in_file.readline()
阅读每一行后如何继续? 我知道我可以使用子字符串并只提取所需的文本,但还有另一种方法吗?
答案 0 :(得分:1)
我假设文件中的字符串是" ascii name的重复模式,后面跟浮点数数字#34;,用空格分隔。因此,使用正则表达式来解析字符串很方便。
import re
s = "COM 0.95958 eh 26.9817 ehc 26.9817 ehoff 0 ew 0.181982 ewoff -0.00400919 oeh 429.788 sp_icr 15.3199 sp_il -11.4382 sp_pdelay -1.53578e-09 sp_pk_icr 15.0735 sp_pk_icr_f 7.81609e+09 sp_pk_il -12.2937 sp_pk_il_f 7.71614e+09 sp_pk_ild 3.05223 sp_pk_ild_f 7.3963e+08 sp_pk_rxrl -0.0909508 sp_pk_rxrl_f 3.01849e+09 sp_pk_txrl -6.33623 sp_pk_txrl_f 6.5967e+08 sp_rxrl -0.187543 sp_txrl -19.2629 "
r = re.compile(r'(\w+)\s+(-?\d+(?:\.\d+)?)') # into 2 groups
d = dict(r.findall(s))
print(d) # {'sp_pk_icr_f': '7.81609', 'COM': '0.95958', ...
print(d['COM']) # 0.95958 (but it is str)
print(float(d['COM'])) # 0.95958
我没有将类似float的字符串转换为float。如果您只需要try: float(d[key])
s = open(FILE_NAME).read().replace('\n', '')
。 ([a-zA-Z]\w*)
如果有多个文件并且您希望将所有映射保持在一起,只需更新dict。
d = {}
for fn in filenames:
s = open(fn, 'r').read()
d.update(r.findall(s))
现在d具有来自所有文件的var-value对。