2017-01-26 3 views
0

EDIT ganzer Post, um freiere des Problems zu sein:Was liefert .read() in Python?

s = "GATATATGCATATACTT" 
t = "ATAT" 

for i in range(len(s)): 
    if t == s[i:i+len(t)]: 
     print i+1, 

So ist der Zweck des Programms oben ist durch die lange Reihe von DNA (s) mit der kurzen Linie von DNA zu scannen (t), um herauszufinden, an welchen Positionen auf s, das t übereinstimmt. Die Ausgabe des obigen Codes ist:

2 4 10 # Dies sind im Grunde die Indexnummern von Zeichenfolge s, die Zeichenfolge t übereinstimmt. aber wie im obigen Code zu sehen ist, ist es i + 1, eine 1-basierte Nummerierung zu geben.

Das Problem, das ich habe, ist, dass, wenn ich versuche, den Code zu ändern, um es die Werte für s und t durch eine Datei zu erhalten, funktioniert die readline() -Funktion für mich nicht. Die Datei motif.txt enthält zwei DNA-Stränge, eine in jeder Zeile.

with open('txt/motif.txt', 'r') as f: 

    s = f.readline() 
    t = f.readline() 

    for i in range(len(s)): 
     if t == s[i:i+len(t)]: 
      print i+1, 

Also wird dieser Code auf der anderen Seite nichts ausgeben. Aber wenn ich t:

t = f.readline().strip() 

Dann das Programm gibt das gleiche Ergebnis wie im ersten Beispiel.

Also ich hoffe, dies hat die Dinge klarer gemacht. Meine Frage ist also, wenn readline() eine Zeichenkette zurückgibt, warum funktioniert mein Programm in Beispiel 2 nicht auf die gleiche Weise wie im ersten Beispiel?

+4

Wie ist Ihr Code * wirklich * eingerückt? Was du hier hast, ist ungültig. – chepner

+6

Sie müssen auch zeigen, was Ihre Eingabe ist (der Inhalt von 'txt/motfi.txt') und was die erwartete Ausgabe ist. – chepner

+3

Und ja, 'readline' gibt einfach die nächste Textzeile aus dem gegebenen Dateiobjekt zurück. – chepner

Antwort

0

Ihr Problem Aussage falsch ist, gibt es keine Möglichkeit s oder t mehr Inhalt hat (und len(s) > 0 oder len(t) > 0) im ersten Beispiel als in der zweiten.

grundsätzlich mit:

s = f.readline() 

dann s wird eine Zeichenfolge wie "foobar \n" enthalten und somit wird len(s)9 sein.

Dann mit:

s = f.readline().strip() 

mit derselben Saite wird len(s)6 sein, weil die gestrippt String "foobar" ist.

so, wenn Sie Linie voller Räume wie s = " \n" ist, s.strip() wird die leere Zeichenkette "", mit len(s) == 0 sein.

Dann wird in diesem Fall Ihre Schleife nicht gestartet und wird nie etwas drucken.

in fast allen anderen Fällen, die ich mir vorstellen kann, sollten Sie eine Ausnahme erhalten, nicht stille Ausgang.

Aber um ehrlich zu sein, Ihr Code ist schlecht, weil niemand verstehen kann, was Sie tun wollen, indem Sie es lesen (einschließlich Sie in sechs Monaten).

+0

Danke für die Antwort. Aber ich denke, Sie haben vielleicht missverstanden, das erste Beispiel hat weniger Inhalt als das zweite. So funktioniert nur das zweite Beispiel. Ich hoffe, die zusätzliche Erklärung, die ich am Ende des Posts hinzugefügt habe, erklärt mehr :) – AltoBalto