awk中的pyk:如何在python类中使用awk脚本?

时间:2011-10-20 23:35:02

标签: python awk

我正在尝试使用python运行awk脚本,因此我可以处理一些数据。

有没有办法让一个awk脚本在python类中运行而不使用系统类来调用它作为shell进程?我运行这些python脚本的框架不允许使用子进程调用,所以我要么找不到在python中转换我的awk脚本的方法,或者如果可能的话,在python中运行awk脚本。

有什么建议吗?我的awk脚本基本上读取了一个文本文件并隔离了包含特定化合物的蛋白质块(输出由我们的框架生成;我添加了一个如何在下面看起来的示例)并隔离它们将它们打印出来不同的文件。

    buildProtein compoundA compoundB
    begin fusion
    Calculate : (lots of text here on multiple lines)
    (more lines)
    Final result - H20: value CO2: value Compound: value 
    Other Compounds X: Value Y: value Z:value

    [...another similar block]

因此,例如,如果我构建一个蛋白质,我需要查看化合物中是否在最终结果行中有CH3COOH,如果是,我必须从命令“buildProtein”开始,直到下一个街区的开头;并将其保存在文件中;然后移动到下一个并查看它是否还有我正在寻找的化合物...如果它没有它我跳到下一个,直到文件的结尾(该文件有多次出现的化合物,我搜索,有时它们是连续的,而有时它们与没有化合物的块交替。

任何帮助都非常受欢迎;现在已经敲了好几个星期,在找到这个网站后我决定寻求帮助。

提前感谢您的善意!

3 个答案:

答案 0 :(得分:4)

如果您不能使用子进程模块,最好的办法是在Python中重新编写AWK脚本。为此, fileinput 模块是一个很棒的过渡工具,具有类似AWK的感觉。

答案 1 :(得分:1)

Python's re module可以提供帮助,或者,如果您不能使用正则表达式,只需要进行快速字段分离,则可以使用the built in str .split() .find()函数。< / p>

答案 2 :(得分:1)

我几乎没有开始学习AWK,所以我不能在这方面提供任何建议。但是,对于一些能够满足您需求的python代码:

class ProteinIterator():
    def __init__(self, file):
        self.file = open(file, 'r')
        self.first_line = self.file.readline()
    def __iter__(self):
        return self
    def __next__(self):
        "returns the next protein build"
        if not self.first_line:     # reached end of file
            raise StopIteration
        file = self.file
        protein_data = [self.first_line]
        while True:
            line = file.readline()
            if line.startswith('buildProtein ') or not line:
                self.first_line = line
                break
            protein_data.append(line)
        return Protein(protein_data)

class Protein():
    def __init__(self, data):
        self._data = data
        for line in data:
            if line.startswith('buildProtein '):
                self.initial_compounds = tuple(line[13:].split())
            elif line.startswith('Final result - '):
                pieces = line[15:].split()[::2]   # every other piece is a name
                self.final_compounds = tuple([p[:-1] for p in pieces])
            elif line.startswith('Other Compounds '):
                pieces = line[16:].split()[::2]   # every other piece is a name
                self.other_compounds = tuple([p[:-1] for p in pieces])
    def __repr__(self):
        return ("Protein(%s)"% self._data[0])
    @property
    def data(self):
        return ''.join(self._data)

我们这里有一个buildprotein文本文件的迭代器,它一次返回一个蛋白质作为Protein对象。这个Protein对象非常聪明,可以知道它的输入,最终结果和其他结果。如果文件中的实际文本与问题中的实际文本不完全相同,则可能必须修改某些代码。以下是使用示例用法的代码的简短测试:

if __name__ == '__main__':
    test_data = """\
buildProtein compoundA compoundB
begin fusion
Calculate : (lots of text here on multiple lines)
(more lines)
Final result - H20: value CO2: value Compound: value 
Other Compounds X: Value Y: value Z: value"""

    open('testPI.txt', 'w').write(test_data)
    for protein in ProteinIterator('testPI.txt'):
        print(protein.initial_compounds)
        print(protein.final_compounds)
        print(protein.other_compounds)
        print()
        if 'CO2' in protein.final_compounds:
            print(protein.data)

我没有打扰保存值,但如果你愿意,你可以添加它。希望这会让你前进。