awk в python: как использовать awk-скрипты в классе python? - PullRequest
1 голос
/ 21 октября 2011

Я пытаюсь запустить скрипт awk с использованием python, чтобы я мог обработать некоторые данные.

Есть ли способ заставить скрипт awk запускаться в классе python без использования системного класса для его вызовакак процесс оболочки?Среда, в которой я запускаю эти скрипты Python, не позволяет использовать вызов подпроцесса, поэтому я застрял либо в поиске способа конвертации моего скрипта awk в python, либо, если это возможно, при запуске скрипта awk в python.

Есть предложения?Мой сценарий 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 ]

4 голосов
/ 21 октября 2011

Если вы не можете использовать модуль подпроцесс , лучше всего перекодировать ваш скрипт AWK в Python. С этой целью модуль fileinput является отличным инструментом перехода с AWK-подобным ощущением.

1 голос
/ 06 ноября 2011

Я только начал изучать 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)

Я не потрудился сохранить значения, но вы можете добавить их, если хотите. Надеюсь, это поможет вам.

1 голос
/ 21 октября 2011

Модуль Python re может помочь, или, если вы не можете возиться с регулярными выражениями и вам просто нужно быстро разделить поля, вы можете использовать встроенную строку .split() и .find() функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...