通过python仅从txt文件中提取特定文本

时间:2018-04-26 08:49:07

标签: python parsing text

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

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

阅读每一行后如何继续? 我知道我可以使用子字符串并只提取所需的文本,但还有另一种方法吗?

1 个答案:

答案 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])

  • 如果文件有多行,但属性保持不变,请将所有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对。