2017-01-11 5 views
1

Ich schrieb ein Skript, um in einigen Dateien zu suchen, in denen in meiner Pipeline Sequenzen eliminiert wurden. Hier ist das Skript:Python - Teil der Zeile fehl am Platz in Datei

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

q = open('eg-not-sec.bait').readlines() 
tm = open('eg_tm0_res').readlines() 
ph = open('eg_ph01_res').readlines() 
secp = open('eg_secp_res').readlines() 
tp = open('eg_tp_res').readlines() 
ps = open('eg_ps_res').readlines() 
gpi = open('eg_es_final_ids').readlines() 
nf = open('eg_elim-test', 'a') 


for line in q: 

    if line not in tm: 
     nf.writelines('%sTMHMM\t'%line) 

    elif line not in ph: 
     nf.writelines('%sPH\t'%line) 

    elif line not in secp: 
     nf.writelines('%sSECP\t'%line) 

    elif line not in tp: 
     nf.writelines('%sTP\t'%line) 

    elif line not in ps: 
     nf.writelines('%sPS\t'%line) 

    elif line not in gpi: 
     nf.writelines('%sGPI\t'%line) 

nf.close() 

Es wäre perfekt funktionieren, wenn nicht für ein Detail ist: die Sequenz-ID für die letzte Zeile ist in der ersten Zeile, und die Identifikation für wo es in letzter Linie beseitigt ist wie dies allein:

EgrG_000049700.1 
PH EgrG_000055800.1 
PH EgrG_000133800.1 
PH EgrG_000221600.1 
PH EgrG_000324200.1 
PH EgrG_000342900.1 
PH EgrG_000391800.1 
PH EgrG_000406000.1 
PH EgrG_000428150.1 
TMHMM EgrG_000430700.1 
PH EgrG_000477400.1 
PH EgrG_000498000.1 
PH EgrG_000502700.1 
TMHMM EgrG_000521200.1 
PH EgrG_000566700.1 
PH EgrG_000633500.1 
PH EgrG_000690700.1 
PH EgrG_000709300.1 
PH EgrG_000823900.1 
PH EgrG_000907100.1 
PH EgrG_000925400.1 
PH EgrG_000974700.1 
PH EgrG_001061400.1 
PH EgrG_001081300.1 
PH EgrG_001136900.1 
PH EgrG_001148800.1 
PH EgrG_002005100.1 
PH EgrG_002026400.1 
PH EgrG_002058200.1 
PH 

es ist ganz einfach manuell lösen nur das Kopieren des ‚PH‘ in letzter Zeile und Einfügen in dem ersten Zeile vor der Sequenz ID, aber ich würde gerne wissen, wie diese zu lösen in meinem Code und ich finde nicht heraus, wie man das macht.

Antwort

0

Die Methode readlines() lässt die Zeilenumbrüche am Ende jeder Zeile in der zurückgegebenen Liste. Also lassen Sie uns diese Codezeile zum Beispiel nehmen ...

nf.writelines('%sPH\t'%line) 

Dies gibt einen Ihrer Linien, komplett mit Newline am Ende. Es setzt dann "PH" und eine Registerkarte auf die nächste Zeile. Und da es keine eigene neue Zeile ausgibt, wird das, was Sie als nächstes schreiben, in derselben Zeile wie der PH erscheinen.

Ich glaube, Sie so etwas wie dies will:

nf.write("PH\t%s" % line) 

Dinge in der richtigen Reihenfolge zu bringen. Beachten Sie auch die Verwendung von write (die eine einzelne Zeichenfolge ausgibt) anstelle von writelines (die eine Sequenz von Zeichenfolgen ausgibt): Sie sagten Python im Grunde, jedes Zeichen der Zeichenfolge einzeln statt alle auf einmal auszugeben.

+0

Tut mir leid, Mann, es funktioniert auch nicht. Es gibt mir das gleiche Ergebnis wie zuvor. :/ Ich habe alle 'writelines()' für 'write()' und alle 'readlines()' für 'read()' geändert und es liefert mir immer genau das gleiche Ergebnis, mit dem PH allein in der letzten Zeile. Ich denke, ich muss damit leben:/hehe –

+0

'' readlines() '' war korrekt; Mit '' read() '' haben Sie die gesamte Datei als eine einzige 'Zeile'. "PH allein in der letzten Zeile" zeigt an, dass Sie das grundlegende Problem nicht behoben haben, das Sie PH anstelle von vor dem '% s' nachgestellt haben. – jasonharper

+0

Ah, tut mir leid. Jetzt hat es funktioniert! Vielen Dank! Aber ich musste '.readlines()' behalten, mit nur 'read()' gab es mir nichts. So, jetzt ist es mit '.readlines()' und '.write()' anstelle von 'writelines()' und mit der Änderung von PH und% s hast du mir gesagt. Danke noch einmal! –

Verwandte Themen