Lesen Sie Bis zu einem Punkt, Python
Ich habe eine text Datei voller Daten, die beginnt mit
#Name
#main
dann es ist gefolgt von vielen zahlen und dann die Datei endet mit
#extra
!side
So, hier ist ein kleines snippet
#Name
#main
60258960
33031674
72302403
#extra
!side
Möchte ich Lesen, nur die zahlen. Aber hier ist der kick, ich will, dass Sie jeweils Ihre eigene, individuelle Zeichenfolge.
Damit ich weiß, wie zu Lesen, nachdem die Header mit
read=f.readlines()[3:]
Aber ich bin ratlos auf alles andere. Irgendwelche Vorschläge?
InformationsquelleAutor user1985351 | 2013-04-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist ziemlich nah dran, wie Sie sind. Sie brauchen nur zu ändern Sie Ihre Liste Scheibe abschneiden, die letzten beiden Zeilen in der Datei zusammen mit den ersten beiden.
readlines
natürlich gibt eine Liste, wo jedes Element ist eine Zeile aus der Datei. Es wird jedoch auch die 'newline' - Zeichen am Ende jeder saite, so müssen Sie möglicherweise zu filtern.read = myfile.read().splitlines()[2:-2]
.Beachten Sie, dass
.strip()
wird auch Streifen alle führenden bzw. nachgestellten Leerzeichen oder tab. Sie könnennumber.rstrip("\n")
zu vermeiden. (das ist irrelevant für OP ' s Frage, aber könnte nützlich sein für alle zu Lesen)InformationsquelleAutor Michael0x2a
Liest Zeile für Zeile. Verwenden Sie #main als ein flag, um die Bearbeitung zu starten. Verwenden Sie #extra als flag zum beenden der Verarbeitung.
Beispiel-Ausgabe
python read_up_to_a_point.py
['60258960', '33031674', '72302403']
InformationsquelleAutor Keith John Hutchison
Ich würde so etwas tun:
nums
wird, enthält nur die Zeilen mit zahlen. Wenn Ihre zahlen sind gut geformt, also nicht negativ und nicht hexadezimal. Das wird nehmen Sie einen regulären Ausdruck, der genau übereinstimmen.InformationsquelleAutor squiguy
Sollten Sie nur verwenden
.readlines()
wenn Sie wissen, dass Ihr input-Dateien wird passen bequem in den Speicher; liest alle Zeilen auf einmal.Meisten der Zeit, können Sie Lesen eine Zeile zu einem Zeitpunkt, und für, dass Sie können nur Durchlaufen, die Datei-handle-Objekt.
Wenn Sie wollen Besondere, schwierige Bedienung, ich empfehle Kapselung der Umgang in einer generator-Funktion wie folgt:
Beachten Sie, dass diese input-Funktion gründlich überprüft die Eingaben, eine Ausnahme auszulösen, wenn irgendetwas ist falsch auf die Eingabe. Aber die Schleife über die Eingabe der Daten ist einfach und sauber; code mit
read_points_data()
werden kann übersichtliche.Machte ich
read_points_data()
konvertieren Sie die Eingabe-Punkte zuint
Werte. Wenn Sie wirklich wollen, die Punkte, die als Zeichenfolgen, Sie können den code ändern; ich hinterließ einen Kommentar da, um Sie daran zu erinnern.Ich denke, das ist eine gute Antwort. Vielleicht sind die Fragesteller konnten sich nicht überprüfen-Eingänge, aber ich denke es ist nie falsch, zu validieren, den input-Daten, und diese Antwort zeigt, wie alle ausblenden, die Validierung in eine eigene Funktion. Beachten Sie, wie die
for
- Schleife, die die Daten verwendet ist sauber und ordentlich trotz der sehr gründlichen Fehlerprüfung... - Generatoren sind eine der Dinge, die ich Liebe Python.Ihre Idee der Kapselung der Lesung der input-Datei in eine generator-Funktion kann einige Verdienst, wenn es geht auf die OP ' s problem. Aber IMHO deinem Beispiel-code wäre besser, wenn es nur illustriert das zentrale Konzept. Ich sage nicht, dass input-Validierung und Fehlerbehandlung sind nicht wichtig, aber diese Frage ist nicht über Sie. Sie konnte nur in der Technik, die sich eignet, um Sie zu tun und ließen dabei in all seiner Pracht. Es ist schwierig sehen vor lauter Bäumen den Wald in Ihrer Antwort den code.
Ich verstehe nicht, warum Sie sagen, "falls es befasst sich mit den OP 's problem", wenn der code genau löst die OP ' s problem. Ich bin nicht einverstanden, dass die Bereitstellung von geprüften, funktionierenden code macht meine Antwort noch schlimmer. Ich auch nicht einverstanden, dass es schwer ist zu verallgemeinern, die aus den funktionierenden code, um andere Probleme zu lösen. Ich denke, wir sind nur noch zu widersprechen in diesem Punkt. Wenn Sie Interesse an der Diskussion dieses weiter hatten wir am besten nehmen Sie es zu plaudern, wie StackOverflow runzelt die Stirn auf längere Diskussionen in den Kommentaren eine Antwort.
Nein danke obwohl du bist anscheinend nicht immer meine...aber das ist OK, <seufz>.
InformationsquelleAutor steveha
Es ist nicht immer eine gute Idee (oder vielleicht sogar machbar) zu verwenden
readlines()
ohne ein argument, denn es liest die gesamte Datei und möglicherweise verbrauchen Sie viel Speicher—und das kann nicht notwendig sein, wenn Sie nicht brauchen, alle von Ihnen auf einmal, je nach genau das, was du tust.Also eine Möglichkeit, das zu tun, was Sie wollen, ist zu verwenden eine Python - generator-Funktion extrahieren der Zeilen oder Werte aus einer Datei. Sie sind sehr einfach zu erstellen, im wesentlichen die Sie gerade verwenden
yield
Aussagen zum zurückgeben von Werten statt vonreturn
. Aus Programmier-Sicht der wesentliche Unterschied zwischen Ihnen ist, dass die Ausführung fortgesetzt mit der Zeile nach deryield
- Anweisung das nächste mal die Funktion aufgerufen wird, eher als von es Erster Linie als das normalerweise der Fall ist. Dies bedeutet, dass Ihre internen Zustand automatisch gespeichert wird zwischen den nachfolgenden Anrufe, die macht zu tun komplizierte Verarbeitung in Ihnen leichter.Hier ist ein ziemlich minimales Beispiel für die Verwendung von zu bekommen, die nur die Daten, die Sie wollen aus der Datei inkrementell eins-Linie-at-a-time, so dass es nicht erforderlich ist, genug Speicher zu halten die ganze Datei:
Natürlich können Sie immer noch sammeln Sie alle zusammen in eine Liste, wenn Sie wollen, so wie hier:
Wie Sie sehen können, ist es möglich, andere nützliche Dinge in die Funktion, überprüfen Sie das format der Datei Vorverarbeitung der Daten oder es auf andere Weise. Im Beispiel oben habe ich ein wenig getan, indem Sie entfernen die neue-Zeile-Zeichen
readlines()
Blätter in jeder Zeile der Liste gibt es. Es wäre trivial zu konvertieren auch jede Zeichenfolge in eine ganze Zahl mithilfeyield int(value)
statt nuryield value
.Hoffentlich geben Sie sich genug, eine Idee von dem, was möglich ist, und die trade-offs beteiligt bei der Entscheidung, welcher Ansatz zu verwenden, zum ausführen der Aufgabe zur hand.
'\n'
zu stellen end-of-line. Sie möchten möglicherweise verwenden Sie "universal newline" - Modus: docs.python.org/2/library/functions.html?highlight=open#open Und seitfile
ist ein eingebautes Schlüsselwort I in der Regel nicht verwendenfile
als Bezeichner. Aber das sind nits; ich mag die Antwort.Danke -- es ist nach allen, nur Ihre eigene Idee präsentiert, ein wenig anders. Du hast Recht, dass nur
'\n'
nötig ist, aber das öffnen der Datei in'rU'
Modus nicht, weil das öffnen der Datei im "text-Modus" - die'r'
und'rt'
beide tun-bedeutet, dass Plattform-abhängigen newline-Zeichen-Handhabung aktiviert werden. Das bedeutet, Sie werden in die einzelnen Zeichen'\n'
bilden, ob oder nicht universal newline support aktiviert ist, in der Python-interpreter verwendet wird-nur, dass Sie bearbeitet werden, werden durch das OS (was schneller ist).InformationsquelleAutor martineau