2014-11-12 7 views
-2

Я пытаюсь извлечь строки, начинающиеся с этих записей, и создать новый файл. Это то, что у меня есть:Извлечение строк из текста в python

def ReadFileContents(): 
    file_content = open('Testing.pdb') 
    all_file_content = file_content.readlines() 
    list3 = [] 
    for line in all_file_content: 
     if line.startswith('TER'):`enter code here` 
      list3.append(line) 
      if line.startswith('HETATM'): 
       list3.apped(line) 
       if line.startswith('CONECT'): 
        list3.append(line) 
        if line.startswith('MASTER'): 
         list3.append(line) 
         if line.startswith('END'): 
          list3.append(line) 
      file = open('list3.txt', 'w') 
      for line in list3: 
       file.write(line + '\n') 
      file.close() 

ReadFileContents()

Проблема заключается в том, что только создает файл list3.txt с линиями, которые начинаются с TER. Любые идеи почему?

Спасибо, Pedro

+0

Потому что вы только соответствуете строкам, начинающимся с TER :) Внутренние условия 'line.startswith ('TER')' абсурдны. – Nemoden

ответ

1

Пробелы в начале строки обозначают уровень блока кода в Python. Предположим, у вас есть следующий код:

if A: 
    #do something 
    if B: 
     #do another thing 

another thing будет сделано только тогда, когда условие True.

def ReadFileContents(): 
    file_content = open('Testing.pdb') 
    all_file_content = file_content.readlines() 
    list3 = [] 
    for line in all_file_content: 
     if line.startswith('TER'): 
      list3.append(line) 
     if line.startswith('HETATM'): 
      list3.apped(line) 
     if line.startswith('CONECT'): 
      list3.append(line) 
     if line.startswith('MASTER'): 
      list3.append(line) 
     if line.startswith('END'): 
      list3.append(line) 
    file = open('list3.txt', 'w') 
    for line in list3: 
     file.write(line + '\n') 
    file.close() 
+0

Совет PS @ Vishnu Upadhyay для использования 'elif' лучше, чем использование одиночных операторов' if', поскольку он будет выполнять меньшее условие выполнения выполнения. Я объяснил суть проблемы, имеющейся в вашем коде. Ответ Вишну должен приниматься и использоваться в реальной программе. Не только из-за elif-заявлений, но и из-за использования инструкции 'with', которая является хорошей практикой. – Nemoden

1

Лучше использовать elif вместо nested if .И всегда лучше использовать context managerwith, чтобы открыть файл, и вы не должны close файл вручную.

изменить это: -

file_content = open('Testing.pdb') 
all_file_content = file_content.readlines() 

к этому: -

with open('Testing.pdb') as file_content: 

Тогда полный код: -

def ReadFileContents(): 
    list3 = [] 
    with open('Testing.pdb') as file_content: # Use `with`. 
     for line in file_content.readlines():  
      if line.startswith('TER'): 
       list3.append(line) 
      elif line.startswith('HETATM'): 
       list3.append(line) 
      elif line.startswith('CONECT'): 
       list3.append(line) 
      elif line.startswith('MASTER'): 
       list3.append(line) 
      elif line.startswith('END'): 
       list3.append(line) 
    with open('list3.txt', 'w') as f: 
     for line in list3: 
      f.write(line + '\n') 

     #Read the file 
     f.seek(0) 
     print f.read() 

ReadFileContents() 
+0

@pedro проверить обновленный код. –

0
import re 
def ReadFileContents(): 
file_content = open('Testing.pdb') 
all_file_content = file_content.readlines() 
list3 = [] 
for line in all_file_content: 
     m=re.match(r"^(?:TER|HETATM|CONECT|MASTER|END).*$,line) 
     if m: 
      list3.append(m.group()) 





file = open('list3.txt', 'w') 
for line in list3: 
     file.write(line + '\n') 
file.close() 

Вы можете использовать re, чтобы получить то, что вы want.It является более масштабируемым тоже.