2017-03-24 8 views
1

Ich versuche zu schreiben "TER" nach einer Zeile im outfile nach bestimmten Rückstand Nummer (passend dazu mit der Rückstand Nummer in der Referenzdatei). Der Code gibt mir keinen Fehler, sondern nur Kopien von der Infile und fügt das Wort nicht hinzu. Beim Versuch, nach ein paar Bits Code zu drucken, denke ich, dass es bricht, wenn ich versuche, im Outfile zu suchen.Hinzufügen von etwas nach einer bestimmten Zeile Python

Also das ist ein Teil. Der andere ist, wie stelle ich dann sicher, dass das Wort "TER" erst nach der letzten Restenummer hinzugefügt wird (es gibt verschiedene Anzahl von ihnen in Zeilen untereinander und ich möchte sie nur nach der letzten hinzufügen). Hier ist mein Code:

import sys 
import argparse 

def main(argv): 
    parser = argparse.ArgumentParser(description='Read SSBOND directives from a PDB, and generate corresponding CONECT records') 
    parser.add_argument('infile', help='input file (PDB format)') 
    parser.add_argument('outfile', help='output file (PDB format)') 
    parser.add_argument('reference', help =' ref') 
    args = parser.parse_args() 

    resnum_1 =[] 
    res = [] 

    with open(args.infile, "r") as f, open(args.outfile, "w+") as of, open(args.reference,"r") as rf: 
     for line in rf: 
      if line[0:4] == "TER ": 
       resnum = line[22:27] 
       resname = line[17:20] 
       chain = line[21] 
       resnum_1.append(resnum) 

       for line in f: 
        of.write(line) 

      for line in of: 
       if line[0:6] == "ATOM ": 
        resnum_fo = line[22:27] 
        resname_fo = line[17:19] 
        chain_fo = line[21] 
        res.append(resnum_fo) 


        if resnum in resnum_1 and resnum_fo in res: 
         of.write("TER\n") 

if __name__ == "__main__": 
    main(sys.argv) 

Vielen Dank!

Die Dateien wie folgt aussehen:

ATOM  0 HB2 CYX D 452  45.962 -2.641 -17.575 1.00 0.00 
ATOM  0 HB3 CYX D 452  46.188 -2.186 -19.050 1.00 0.00 
TER  995  CYX D 452 
ATOM 995 N ARG D 492  42.476 10.547 -39.562 1.00 0.00 
+0

Sow uns die Eingabedatei Inhalt (oder eine vereinfachte Version), dasselbe für die Referenzdatei und eine gewünschte Ausgabe (anders als der obige Code erzeugt). Auf der anderen Seite sehe ich, dass Sie während der Iteration in die Ausgabedatei schreiben. Ich denke, das könnte den Dateizeiger verwirren. – CristiFati

+0

Ich habe getan, danke – Loki

+0

Leider kann ich nicht herausfinden, welche der 4 Zeilen zu welcher Datei gehören :( – CristiFati

Antwort

1

Ein paar Punkte/Vermutungen:

  • Sie öffnen of als w+, aber dann tun Sie for line in of:. Meinst Du f? (Ich würde einige aussagekräftigeren Namen vermuten lassen)

  • Sie scheinen gegen "ATOM " zu überprüfen (Leerzeichen beachten). Aus Ihrer Datei sieht es so aus, als sollte es nur 1 Leerzeichen sein.

Um mit den Problemen der Räume weg, ich schlage vor, Sie split verwenden:

"one two three".split() 
['one', 'two', 'three'] 

für Ihren Fall So verwenden wie:

for line in rf: 
    contents = line.split() 
    if contents[0] == "TER": 
     ... 


for line in f: 
    contents = line.split() 
    if contents[0] == "ATOM": 
     ... 
Verwandte Themen