在python中读取输入文件

时间:2018-05-07 09:19:26

标签: python

我有一个类似

的输入文件
    ===========================
    __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

有关改进此代码或使用不同输出方法(例如作为字典)的任何建议,以获取参数的值是有帮助的。

5 个答案:

答案 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'}