我有许多处理大文件的python代码。在其中一些中,我在列之间执行操作或根据它们的内容进行选择。由于输入文件可以具有不同的结构,因此操作是通过命令行提供的,其语法类似于c3 + c5 -1
或(c3<4) & (c5>4)
(或组合)。c4
被解释为输入文件的第四列。
我的文件看起来像这样('input_file.txt'):
21.3 4321.34 34.12 4 343.3 2 324
34.34 67.56 764.45 2 54.768 6 45265
986.96 87.98 234.09 1 54.456 3 5262
[...]
假设我想将第 4 列与第 5 列相加并减去 1。
我会这样做
import re
import numpy as np
operation = "c3 + c5 -1" #in reality given from command line
pattern = re.compile(r"c(\d+?)") # compile the regex that matches the column number
# get the actual expression to evaluate
to_evaluate = pattern.sub("ifile[:,\\1]", operation)
#to_evaluate is: "ifile[:,3] + ifile[:,5] -1"
ifile = np.loadtxt('input_file.txt')
result = eval(to_evaluate) #evaluate the operation required
print(result)
# do the rest
输出
[5, 7, 3, ...]
我想出了这个实现,因为:
numpy
如果我想改变读取文件的方法(目前我可以决定使用orpandas
)或者如果我想添加操作,它很容易编写和修改- 在我能做的事情上给了我很大的自由。我可以治疗
c3 + c5 -1
,(c3<4) & (c5>4)
或(c2+c4)>0
以同样的方式。 - 我在所有代码中都有相同的签名:出错的可能性较小
我知道这eval
可能是不安全的(尽管目前我是这些代码的唯一用户)并且可能比相应的代码慢,但我想不出更好的方法。
有没有人知道更好/更安全的方法来实施此类操作?
额外编辑:如果重要的话,我正在运行 python 2.7