首页 > 解决方案 > 通过python仅从txt文件中提取特定文本

问题描述

我有一个文本文件,其中包含以下变量及其值。

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()

阅读每一行后如何进行?我知道我可以使用子字符串并仅提取所需的文本,但还有其他方法可以做到吗?

标签: pythonparsingtext

解决方案


我假设文件中的字符串是“ascii 名称后跟类似浮点数的数字”的重复模式,用空格分隔。因此,使用正则表达式来解析字符串很方便。

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

我没有将类似浮点的字符串转换为浮点数。如果你只需要它try: float(d[key])

  • 如果文件有多行但属性成立,请将所有 NEWLINE 替换为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 对。


推荐阅读