2016-06-28 7 views
0

Ich schreibe Code zum Abrufen bestimmter Zeichen in einer Textdatei nach Position. Zum Beispiel möchte ich die Folge von Zeichen zwischen Positionen von 1043-1049 aus einem Text, wie zum Beispiel:Extrahieren einer Zeichenfolge aus einer Datei mit einer Position und Länge

......... acddex ............

... und so weiter. Ich möchte diese "acddex" Sequenz aus diesem Text herausholen. Ich kenne seine Reihenfolge und Position. Bis jetzt kann ich nur die Datei öffnen und die Position eingeben, die ich will, aber ich habe keine Ahnung, wie man die Reihenfolge des ganzen Textes zählt, härter noch, die ganze Datei ist eine Kombination von Samples, also muss ich auch eine Wiederholung/Aktualisierung einstellen von Zeichenzahl zwischen bestimmten Zeichen „>“, ist es wie:

agoejngodgfjnsodjnfvsojdnvodfjnodjnfbodjngodjgndojgndlkfnvldfkngldjnfgdfjgnldjfngldjfngldfjngldjfngldjnfg dkjdnfgkjdnfgkjndfkgjndfjgnojfgnlfjngdljfngldjfng kdfjngkdfjngkjdndksjngskfjgndkfjgn

Also muss ich die Sequenzen aus diesen Proben, die in derselben Datei sind, wenn ich wissen wo das gebraucht wird Die Quigen beginnen. Wie kann ich das tun?

Hinweis: Es ist keine kurze Sequenz mit etwa 200.000 Zeichen, und ich möchte, dass es mir die Zeichen zwischen 1046.-1052. Positionen, zum Beispiel.

+1

Suchen Sie Syntax wie '" abcdefg "[2: 4]' oder tun Sie möchten wissen, wie man eine Datei liest? – Matthias

+0

Ist die Datei klein genug, dass Sie sie einfach in eine Zeichenfolge lesen könnten? Dann könnten Sie einfach die gewünschten String-Slices ansprechen. – Prune

+0

die Sache ist, gibt es etwa 200.000 Zeichen in meinen Daten, und was ich von dem Code will, ist zum Beispiel; Drucken (zwischen 1046.-1052. Zeichen) – Lindy

Antwort

0
stuff = "agoejngodgfjnsodjnfvsojdnvodfjnodjnfbodjngodjgndojgndlkfnvldfkngldjnfgdfjgnldjfn" 

print(stuff[10:20]) 

Dadurch werden die Zeichen von Position 10 bis 20.

So drucken, wenn Sie 1043-1049 wollen:

print(stuff[1043:1049]) 
1

Seek to the byte position of the start of the sequence you want, dann read anrufen und ihm sagen, wie Sie viele Bytes wollen.

Beispiel:

starting_position = XXX # replace XXX with the starting position of your 
         # desired string 
read_length = YYY # replace YYY with how many characters you want to read 

with open("filename.txt") as f: 
    f.seek(starting_position) 
    st = f.read(read_length) 

# st now has your characters 

Anmerkung: diese Antwort nimmt die Datei entweder ASCII codiert ist, oder er verwendet eine andere Codierung, wobei jedes Zeichen nur ein Byte in der Datei ist.

Wenn Sie viele Sequenzen extrahieren, versuchen Sie, sie in der sequentiellen Reihenfolge zu erhalten, bevor Sie suchen, so dass Sie nicht um die Datei springen. Nachdem Sie es funktioniert haben, ziehen Sie in Betracht, Ihren Code mit mmap für die Datei anstelle eines normalen Öffnens zu profilieren. Sie können eine Beschleunigung sehen. (Aber wie bei allen Optimierungen - stellen Sie sicher, dass Sie zuerst Profil und sehen, ob dieser Teil Ihres Codes wirklich das Teil ist, das optimiert werden muss!)

+0

Danke das war wirklich hilfreich, und was ist, wenn meine Positionen nach einem bestimmten Zeichen wie z. B. Zeilenumbruch beginnen; "> zethga00778ndskasdhgfb5677 aakhsbfkajef12938mas987124mn ......" die Zählung beginnt tatsächlich von aakhsb, ich meine direkt nach einer Pause, und nach jeder Pause erfrischt sich die Zählung, und es gibt mehr als 1 Orte, die ich melden möchte, also brauche ich den Code, um interactionally mich die Positionen gleich danach zu fragen Jede Pause für die gleiche Datei. Danke. – Lindy

+0

@Lindy Dann müssen Sie den Code zum Lesen von Dateien in eine Schleife mit einer Eingabeaufforderung für Benutzereingaben setzen (verwenden Sie 'input' wenn Sie Python 3.x verwenden, und' raw_input' if Python 2.x) und wandeln die Eingabe in eine Ganzzahl um, die als Argumente für 'seek' und' read' verwendet wird. Die Zeilenumbrüche sind die gleichen wie jedes andere Zeichen - ein Byte pro Zeilenumbruch, es sei denn, Sie sind unter Windows. wobei jeder Zeilenumbruch zwei Zeichen – skrrgwasme

+0

wie diese ‚read_length = 6 q = 0 mit offenen ("filename.txt") als f.? f.seek (#line Bruch) wenn q <35 raw_input (starting_position :) f.seek (starting_position) st = f.read (read_length) print (st) q = q + 1 f.seek (#next Zeilenumbruch #) sonst drucken (Fertig!) ' – Lindy

Verwandte Themen