python - 通过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()
阅读每一行后如何进行?我知道我可以使用子字符串并仅提取所需的文本,但还有其他方法可以做到吗?
解决方案
我假设文件中的字符串是“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 对。
推荐阅读
- python - 停止索引太多
- ms-access - MS 365 访问表单 Dlookup #Name?
- java - 如何在不覆盖其他孩子的情况下添加新孩子
- c# - 过滤 IQueryable 会带回错误的结果
- kubernetes - 防火墙/限制 Kubernetes pod 出口流量
- python - 运行 Rasa Stack 时超出最大重试次数和连接被拒绝错误
- sql-server - 如何获取 sql server 侦听器名称
- react-native - 哪个关键字我可以在 Play 商店中找到我的应用程序?
- redirect - 如何使用 Lamda 边缘函数处理 ClodFront 重定向
- docker - 无法运行 docker compose 显示错误 -bash: /usr/bin/docker-compose: No such file or directory