我有一个类似
的输入文件 ===========================
__A= 2.3
__b= 3.26
===========================
__ctx= 4.2
===========================
__itermax= 100
__errmax= 1e-07
使用此输入文件生成了不同代码(未在python中实现)中的输出集合。我现在正在尝试编写一些Python脚本来读取此输入文件以及其他生成的输出以执行后处理分析。 因此,我想通过python脚本提取每个参数(A,b,ctx,...)的值。请注意,此输入文件与所讨论的设置文件here不同,因为我无法对输入文件的结构执行任何修改。
我试过了
import sys
try:
directory_name=sys.argv[1]
print(directory_name)
except:
print('Please pass directory_name')
input_file = directory_name +"input.txt"
with open(input_file) as fin:
for line in fin:
exec(line)
运行代码后遇到的错误是
File "code.py", line 14, in <module>
exec(line)
File "<string>", line 1
===========================
^
SyntaxError: invalid syntax
有关改进此代码或使用不同输出方法(例如作为字典)的任何建议,以获取参数的值是有帮助的。
答案 0 :(得分:0)
从文件中执行随机代码行是有风险的,而且有点'hacky'。如果您真的想这样做,修复代码的最简单方法就是尝试每一行:
import sys
try:
directory_name=sys.argv[1]
print(directory_name)
except:
print('Please pass directory_name')
input_file = directory_name +"input.txt"
with open(input_file) as fin:
for line in fin:
try:
exec(line)
except:
print("Line invalid: {}".format(line))
答案 1 :(得分:0)
你首先必须检查“line”才能执行sens。
问题是当line =“=========”时 你可以使用:
if line.startwith("===")
continue
跳过它。
或
if line.startwith("__"):
exec(line)
以避免遗漏未知的东西
答案 2 :(得分:0)
你想要执行字符串&#34; ==================&#34; ?
这个字符串不是python代码
有一种懒惰的方式,使用try ... except ...
来解决这个问题。
import sys
try:
directory_name=sys.argv[1]
print(directory_name)
except:
print('Please pass directory_name')
input_file = directory_name +"input.txt"
with open(input_file) as fin:
for line in fin:
try:
exec(line)
except Exception as e:
print(e)
另一种方法是你可以在执行它们之前删除所有无用的字符串。
答案 3 :(得分:0)
用于提取thei值使用re.search
import re
import sys
textfile = sys.argv[1]
f = open(textfile, 'r').readlines()
for l in f:
extract = l.rstrip()
try:
f = re.search('__A= (.*)', extract)
return True
except:
return False
valueA = f.group(1)
print valueA
答案 4 :(得分:0)
尝试一个简单的正则表达式:
import re
e = r'^__(.*?)=(.*?)$'
with open('data.txt') as f:
print(dict(re.findall(e, f.read(), re.M)))
这将打印:
{'A': ' 2.3', 'b': ' 3.26', 'ctx': ' 4.2', 'itermax': ' 100', 'errmax': ' 1e-07'}