2015-02-10 3 views
1

У меня есть 3 выходных файла, содержащих координаты x, y, z соответственнонаписать текстовый файл из текстовых файлов python

file1.txt (содержит только x) | file2 (Y) | file3 (Z)

2.113 
3.023 
-7.234 
... 

и родительский файл pdb, который содержит данные координат. Я хочу извлечь только те строки из файла pdb, соответствующие координатам x, y, z из файла1, file2, file3.The строки файла pdb;

ATOM 1 O5' G A 93 -12,706 19,299 0,129 1,00 0,00 O

Смелые значения были бы мои критерии соответствия, чтобы скопировать всю строку.

1- Как я могу объединить три выходных файла, чтобы сделать один файл, который может дать мне координаты x, y, z в строке для работы с моим скриптом.

final_file = [file1, file2, file3]?

2- Как я могу извлечь баллы по критериям соответствия;

def read_convex_points(final_file,parent_pdb): 
    with open("output.txt","w") as f1: 
     with open(final_file) as f2: 
      with open(parent_pdb) as f3: 
       for line1 in f2: 
        for line2 in f3: 
         if line1 in line2: 
          f1.write(line2) 
    return    

final_file = "file1.txt" 
parent_pdb = "original.pdb" 
read_convex_points(final_file,parent_pdb) 

Я написал функцию что-то вроде этого, но если условие не работает.

+0

Ваше описание немного неясно. Являются ли координаты отдельными файлами? Например, координаты X в файлах1, координаты Y в файле2, координаты Z в файле3. –

+0

Да, вы правы. –

+0

У вас есть 2 вопроса, они, вероятно, должны быть в отдельных сообщениях. Но в любом случае, если вы работаете в Unix или Linux, самым простым способом присоединиться к 3 файлам в 1 является использование 'paste'. Это довольно легко сделать в Python, как показывает ответ Питера. Вы хотите сделать вставку в той же программе, которая выполняет тестирование соответствия? Я думаю, что было бы неплохо сделать это в отдельной программе, особенно если вам нужно сделать несколько проходов через данные. –

ответ

0

Вот один способ вставить несколько файлов в Python. Он обрабатывает любое количество входных файлов, но, как решение Питера, если файлы имеют разные числа строк, он останавливается, когда у самого короткого файла заканчиваются строки.

Поля в выходном файле разделены строкой delimiter, которая является пространством по умолчанию.

def paste(sources, dest, delimiter=' '): 
    fsrc = [open(fname, 'r') for fname in sources] 
    fdest = open(dest, 'w') 
    for t in zip(*fsrc): 
     outline = delimiter.join([line.strip() for line in t]) + '\n' 
     fdest.write(outline) 
    for f in fsrc: 
     f.close() 
    fdest.close() 


paste(('file1', 'file2', 'file3'), 'final_file') 
0

Вы можете объединить файлы, как это:

def merge(paths): 
    with open(paths[0]) as f1, open(paths[1]) as f2, open(paths[2]) as f3: 
     try: 
      yield next(f1), next(f2), next(f3) 
     except StopIteration: 
      return 

for x, y, z in merge((file1, file2, file3)): 
    # check if matching 

Оговорки, это предполагает, что файлы имеют одинаковую длину, поэтому он остановится в тот момент он встречает кратчайший файл. Возможно, это возможно.

+0

Спасибо, что помогли. это дало мне ошибку, но вставьте функцию, которую мой linux упрощает. Однако я получил свой файл output.txt пустым после согласования координат. Если я печатаю строку1, тогда он показывает значения, но не может пройти в следующем цикле. Любые рекомендации по этой проблеме? для линии1 in f2: для линии2 in f3: если линия1 in line2: –

Смежные вопросы