Friday 24 November 2017

Python Read Text File As Binary Optionen


Es ist an sich nicht einfach. Theres keine Möglichkeit zu wissen, sicher, obwohl Sie eine vernünftig gute Vermutung in den meisten Fällen nehmen können. Dinge, die du gerne machst: suche nach bekannten Zaubernoten in Binärsignaturen Nach dem Unicode-Byte-Bestellzeichen am Anfang der Datei suchen Wenn die Datei regelmäßig 00 xx 00 xx 00 xx (für beliebige xx) oder umgekehrt ist, Das ist ganz möglich UTF-16 Ansonsten suche nach 0s in der Datei eine Datei mit einem 0 in ist unwahrscheinlich, dass eine Single-Byte-Encoding Textdatei. Aber das alles heuristisch - es ist ganz möglich, eine Datei zu haben, die eine gültige Textdatei und eine gültige Bilddatei ist. Es wäre wahrscheinlich Quatsch als Textdatei, aber legitim in irgendeiner Kodierung oder andere. Antwortete Sep 18 09 bei 20: 07How zum Lesen und Schreiben von Dateien in Python Wenn Sie in der Python-Sprache über die trivialsten Programme hinaus programmieren, müssen Sie in der Regel Daten aus Dateien schreiben und Daten in Dateien schreiben, die außerhalb des Programms vorhanden sind. Python bietet einfache Mechanismen für den Zugriff und die Änderung bestimmter Dateien mit Standardfunktionen, die Teil der Kernsprache sind. Öffnen Sie Dateien in Python Entdecken Sie die Nutzungsrichtlinie. Sie müssen wissen, ob Sie von der Datei lesen oder schreiben müssen, bevor Sie die Datei öffnen können. Öffnen Sie einfach die Datei mit den Berechtigungen, die Sie wirklich brauchen und don39t eine Datei im Read-Write-Modus öffnen, wenn Sie nur noch von ihr lesen müssen. Dies wird verhindern, dass versehentliche Schriften zu archivieren, die Sie nicht schreiben sollten. Entscheiden Sie, ob der ASCII - oder Binärmodus verwendet werden soll. Wenn du Texte liest, willst du den ASCII-Modus verwenden. Wenn Sie Binärdaten lesen, verwenden Sie den Binärmodus. Dieser Modus übersetzt Zeilenendungen in den Modus, den Ihr Betriebssystem verwendet. Erstellen Sie den Modus-String. Das erste Zeichen ist Lese - oder Schreibmodus. Wenn Sie im Binärmodus öffnen möchten, fügen Sie dem Ende des Strings einen Quotplan hinzu. Zum Beispiel, um im ASCII-Modus zu lesen, wäre die Modus-Zeichenfolge quittiert und im binären Modus zu schreiben, wäre die Modus-Zeichenfolge quadratisch. Öffnen Sie die Datei mit der geöffneten Funktion. Speichern Sie das resultierende Dateiobjekt in einer Variablen. Zum Beispiel: f open (quotfilenamegoesherequot, quotrquot) Lesen von Dateien in Python Iterate über alle Zeilen. Ein Dateiprojekt kann als Sammlung mit der Quellschleife verwendet werden. Sie können über alle Zeilen in einer Datei (eine gemeinsame Aktion) mit der for-Anweisung iterieren. Für Zeile in f: Druckzeile Suchen Sie einen bestimmten Punkt in der Datei. Dateien werden nicht immer sequentiell gelesen, so dass es oft notwendig ist, um einen bestimmten Punkt in der Datei zu suchen, bevor sie aus der Datei lesen. Sie können dies mit der Suchmethode eines Dateiobjekts tun. Suche nach dem 100. Byte f. seek (100) Sucht nach 10 Bytes aus dem aktuellen Byte f. seek (10, 1) Binärdaten aus einer Datei lesen. Mit der Lesemethode eines Dateiobjekts können Sie eine beliebige Anzahl von Bytes aus einer Datei lesen. Lesen Sie 16 Bytes aus der Datei buf f. read (16) Schreiben Sie in Python-Dateien Schreiben Sie Daten in eine Datei. Wenn eine Datei im Schreibmodus geöffnet ist, können Sie ASCII - oder Binärdaten an sie schreiben. Dies geschieht mit der Schreibmethode eines Dateiobjekts. F. write (quotThis is some textquot) Schreibe Objekte in eine Datei. Wenn du einen internen Zustand des Objekts speichern musst, kannst du ihn quittieren. Um ein Objekt zu pflücken, müssen Sie zuerst das Pickle-Modul importieren. Danach kannst du fast jedes Objekt mit der pickle. dump-Funktion abholen. Import pickle pickle. dump (anyobject, f) Schließen Sie die Datei. Nachdem das Schreiben abgeschlossen ist, müssen Sie die Datei schließen. Dadurch wird sichergestellt, dass alle Puffer gespült werden und die Datei nicht gesperrt ist, so dass andere Programme darauf zugreifen können. Dies geschieht mit der engen Methode eines Dateiobjekts.7. Input und Output Es gibt mehrere Möglichkeiten, die Ausgabe eines Programms zu präsentieren, die Daten in einer menschenlesbaren Form gedruckt oder in eine Datei zur zukünftigen Verwendung geschrieben werden können. In diesem Kapitel werden einige der Möglichkeiten diskutiert. 7.1. Fancier Output Formatierung Bisher haben wir auf zwei Arten des Schreibens von Werten: Ausdrucksaussagen und der print-Anweisung gestoßen. (Ein dritter Weg ist mit der write () - Methode von Dateiobjekten, auf die die Standardausgabedatei als sys. stdout referenziert werden kann. Weitere Informationen hierzu finden Sie in der Bibliotheksreferenz.) Oft können Sie mehr Kontrolle über die Formatierung Ihrer Ausgabe haben als einfach Druckraum-getrennte Werte. Es gibt zwei Möglichkeiten, um Ihre Ausgabe zu formatieren, die erste Möglichkeit ist, alle String-Handling selbst mit String-Slicing und Verkettung Operationen können Sie jedes Layout, das Sie sich vorstellen können, zu tun. Die String-Typen haben einige Methoden, die nützliche Operationen zum Auffüllen von Strings zu einer gegebenen Spaltenbreite durchführen, die in Kürze diskutiert werden. Der zweite Weg ist, die Methode str. format () zu verwenden. Das String-Modul enthält eine Template-Klasse, die eine weitere Möglichkeit bietet, Werte in Strings zu ersetzen. Eine Frage bleibt natürlich: Wie konvertiert man Werte in Strings. Zum Glück hat Python Möglichkeiten, jeden Wert in einen String umzuwandeln: an die repr () oder Str () - Funktionen weiterzugeben. Die Funktion str () soll Repräsentationen von Werten darstellen, die ziemlich menschlich lesbar sind, während repr () dazu dient, Darstellungen zu erzeugen, die vom Interpreter gelesen werden können (oder einen SyntaxError zwingen, wenn es keine gleichwertige Syntax gibt). Für Objekte, die eine bestimmte Darstellung für den menschlichen Verzehr haben, wird str () denselben Wert wie repr () zurückgeben. Viele Werte, wie z. B. Zahlen oder Strukturen wie Listen und Wörterbücher, haben die gleiche Darstellung mit beiden Funktionen. Strings und Fließkommazahlen haben insbesondere zwei verschiedene Darstellungen. Hier gibt es zwei Möglichkeiten, eine Tabelle von Quadraten und Würfeln zu schreiben: (Beachten Sie, dass im ersten Beispiel ein Leerzeichen zwischen jeder Spalte durch die Art und Weise gedruckt wurde: Es fügt immer Leerzeichen zwischen seinen Argumenten hinzu.) Dieses Beispiel zeigt die Str. rjust () - Methode von String-Objekten, die rechts einen String in einem Feld einer gegebenen Breite rechtfertigt, indem er sie mit Leerzeichen auf der linken Seite aufnimmt. Es gibt ähnliche Methoden str. ljust () und str. center (). Diese Methoden schreiben nichts, sie geben einfach einen neuen String zurück. Wenn die eingegebene Zeichenfolge zu lang ist, schneiden sie es ab, aber geben Sie sie unverändert zurück, das wird Ihre Spalte ausrichten, aber das ist in der Regel besser als die Alternative, die über einen Wert liegen würde. (Wenn Sie wirklich Trunkierung wollen, können Sie immer eine Scheibenoperation hinzufügen, wie in x. ljust (n): n.) Es gibt eine andere Methode, str. zfill (). Die einen numerischen String auf der linken Seite mit Nullen pads. Es versteht sich über Plus - und Minuszeichen: Die Grundnutzung der str. format () - Methode sieht so aus: Die Klammern und Zeichen in ihnen (sogenannte Formatfelder) werden durch die in die str. format () - Methode übergebenen Objekte ersetzt. Eine Zahl in den Klammern bezieht sich auf die Position des Objekts, das in die Methode str. format () übergeben wurde. Wenn Keyword-Argumente in der Methode str. format () verwendet werden, werden ihre Werte mit dem Namen des Arguments bezeichnet. Positions - und Keyword-Argumente können beliebig kombiniert werden: 7.2. Lesen und Schreiben von Dateien open () gibt ein Dateiobjekt zurück und wird am häufigsten mit zwei Argumenten verwendet: open (Dateiname, Modus). Das erste Argument ist ein String mit dem Dateinamen. Das zweite Argument ist ein weiterer String mit einigen Zeichen, die die Art und Weise beschreiben, in der die Datei verwendet wird. Modus kann r sein, wenn die Datei nur gelesen wird, w für nur das Schreiben (eine vorhandene Datei mit dem gleichen Namen wird gelöscht), und a öffnet die Datei zum Anhängen von Daten, die in die Datei geschrieben werden, wird automatisch zum Ende hinzugefügt. R öffnet die Datei zum Lesen und Schreiben. Das Modus-Argument ist optional r wird angenommen, wenn it8217s weggelassen wird. Unter Windows, b an den Modus angehängt, öffnet sich die Datei im Binärmodus, also gibt es auch Modi wie rb. Wb. Und rb. Python unter Windows unterscheidet zwischen Text - und Binärdateien die End-of-Line-Zeichen in Textdateien werden automatisch leicht verändert, wenn Daten gelesen oder geschrieben werden. Diese Hinter-den-Szenen-Modifikation auf Datei-Daten ist gut für ASCII-Textdateien, aber it8217ll korrupte Binärdaten wie die in JPEG-oder EXE-Dateien. Seien Sie sehr vorsichtig, den Binärmodus beim Lesen und Schreiben solcher Dateien zu verwenden. Auf Unix ist es nicht verletzt, um ein b an den Modus anzuhängen, also kannst du es plattformunabhängig für alle Binärdateien verwenden. 7.2.1. Methoden der Dateiobjekte Der Rest der Beispiele in diesem Abschnitt wird davon ausgehen, dass bereits ein Dateiobjekt mit dem Namen f erstellt wurde. Um einen file8217s Inhalt zu lesen, ruf f. read (size) an. Die einige Datenmengen liest und als String zurückgibt. Größe ist ein optionales numerisches Argument. Wenn die Größe weggelassen oder negativ ist, wird der gesamte Inhalt der Datei gelesen und zurückgegeben it8217s Ihr Problem, wenn die Datei doppelt so groß ist wie Ihr machine8217s Speicher. Ansonsten werden die meisten Bytes gelesen und zurückgegeben. Wenn das Ende der Datei erreicht ist, gibt f. read () einen leeren String (quotquot) zurück. F. readline () liest eine einzelne Zeile aus der Datei, wobei ein Zeilenumbruch (n) am Ende der Zeichenfolge verbleibt und wird nur in der letzten Zeile der Datei ausgelassen, wenn die Datei in einem Zeilenumbruch endet. Dies macht den Rückgabewert eindeutig, wenn f. readline () einen leeren String zurückgibt, das Ende der Datei erreicht ist, während eine Leerzeile durch n dargestellt wird. Eine Zeichenfolge, die nur eine einzige Zeile enthält. Zum Lesen von Zeilen aus einer Datei können Sie das Dateiobjekt umschleifen. Dies ist Speicher effizient, schnell und führt zu einfachen Code: Wenn Sie alle Zeilen einer Datei in einer Liste lesen möchten, können Sie auch die Liste (f) oder f. readlines () verwenden. F. write (string) schreibt den Inhalt der Zeichenfolge in die Datei und gibt keine zurück. Um etwas anderes als einen String zu schreiben, muss es in einen String zuerst konvertiert werden: f. tell () gibt eine Ganzzahl zurück, die die Datei object8217s aktuelle Position in der Datei gibt, gemessen in Bytes vom Anfang der Datei. Um die Datei object8217s zu ändern, verwenden Sie f. seek (Offset, fromwhat). Die Position wird aus dem Hinzufügen von Offset zu einem Referenzpunkt berechnet. Der Referenzpunkt wird durch das Argument ausgewählt. A aus dem Wert von 0 Maßen vom Anfang der Datei, 1 verwendet die aktuelle Datei Position, und 2 verwendet das Ende der Datei als Referenzpunkt. Von denen kann weggelassen werden und standardmäßig auf 0, mit dem Anfang der Datei als Referenzpunkt. Wenn Sie mit einer Datei fertig sind, rufen Sie f. close () an, um es zu schließen und alle Systemressourcen freizugeben, die von der geöffneten Datei aufgenommen wurden. Nach Aufruf von f. close (). Versuche, das Dateiobjekt zu verwenden, werden automatisch fehlschlagen. Es ist eine gute Praxis, das mit Schlüsselwort zu verwenden, wenn es um Dateiobjekte geht. Dies hat den Vorteil, dass die Datei ordnungsgemäß geschlossen ist, nachdem ihre Suite beendet ist, auch wenn eine Ausnahme auf dem Weg erhoben wird. Es ist auch viel kürzer als das Schreiben von äquivalenten Versuchen - endlich Blöcke: Dateiobjekte haben einige zusätzliche Methoden wie isatty () und truncate (), die weniger häufig verwendet werden, konsultieren Sie die Bibliotheksreferenz für eine vollständige Anleitung zur Dateiobjekte. 7.2.2. Das Speichern von strukturierten Daten mit json Strings kann einfach in eine Datei geschrieben und gelesen werden. Zahlen nehmen ein bisschen mehr Aufwand, da die read () - Methode nur Strings zurückgibt, die an eine Funktion wie int () übergeben werden müssen. Die einen String wie 123 annimmt und seinen numerischen Wert 123 zurückgibt. Wenn Sie komplexere Datentypen wie verschachtelte Listen und Wörterbücher speichern möchten, wird das Parsen und Serialisieren von Hand kompliziert. Anstatt Benutzer ständig zu schreiben und Debugging-Code, um komplizierte Datentypen in Dateien zu speichern, erlaubt Python Ihnen das beliebte Datenaustauschformat namens JSON (JavaScript Object Notation) zu verwenden. Das Standardmodul namens json kann Python-Datenhierarchien aufnehmen und in Stringdarstellungen umwandeln, wobei dieser Prozeß als Serialisierung bezeichnet wird. Die Rekonstruktion der Daten aus der Stringdarstellung heißt Deserialisierung. Zwischen Serialisierung und Deserialisierung kann die Zeichenfolge, die das Objekt repräsentiert, in einer Datei oder Daten gespeichert oder über eine Netzwerkverbindung zu einer entfernten Maschine geschickt worden sein. Das JSON-Format wird häufig von modernen Anwendungen genutzt, um den Datenaustausch zu ermöglichen. Viele Programmierer sind bereits vertraut, was eine gute Wahl für die Interoperabilität macht. Wenn du ein Objekt x hast. Sie können ihre JSON-String-Darstellung mit einer einfachen Codezeile ansehen: Eine weitere Variante der Dumps () - Funktion, genannt dump (). Einfach das Objekt zu einer Datei serialisiert. Wenn also f ein Dateiprojekt zum Schreiben ist, können wir dies tun: Um das Objekt wieder zu dekodieren, wenn f ein Dateiobjekt ist, das zum Lesen geöffnet wurde: Diese einfache Serialisierungstechnik kann Listen und Wörterbücher verarbeiten, aber beliebige Klasseninstanzen serialisieren In JSON erfordert etwas Aufwand. Die Referenz für das json-Modul enthält eine Erläuterung dazu. Pickle - das pickle module Im Gegensatz zu JSON. Pickle ist ein Protokoll, das die Serialisierung von beliebig komplexen Python-Objekten ermöglicht. Als solches ist es spezifisch für Python und kann nicht verwendet werden, um mit Anwendungen in anderen Sprachen geschrieben zu kommunizieren. Es ist auch standardmäßig unsicher: Deserialisierung von Pickle-Daten, die von einer nicht vertrauenswürdigen Quelle kommen, können beliebigen Code ausführen, wenn die Daten von einem erfahrenen Angreifer erstellt wurden. Mit Vorschlag von chrispy: Beachten Sie, dass die mit Anweisung nicht in Versionen von Python unter 2.5 verfügbar ist. Um es in v zu verwenden, musst du es importieren: In 2.6 ist das nicht nötig. In Python 3 ist es ein bisschen anders. Wir werden nicht mehr rohe Zeichen aus dem Stream in Byte-Modus, sondern Byte-Objekte, also müssen wir die Bedingung ändern: Oder wie benhoyt sagt, überspringen Sie die nicht gleich und nutzen Sie die Tatsache, dass b zu falsch auswertet. Damit ist der Code zwischen 2.6 und 3.x ohne Änderungen kompatibel. Es würde auch sparen Sie von der Änderung der Bedingung, wenn Sie von Byte-Modus zu Text oder umgekehrt gehen. Um eine Datei jeweils ein Byte zu lesen (ignorieren Sie die Pufferung), können Sie die Zwei-Argument-Iter (kündbare, Sentinel) eingebaute Funktion verwenden: Es ruft file. read (1) auf, bis es nichts zurückgibt b (leeres bytestring). Der Speicher wird nicht unbegrenzt für große Dateien. Du kannst Pufferung0 zu öffnen (). Um die Pufferung zu deaktivieren, garantiert es, dass nur ein Byte pro Iteration gelesen wird. Mit-Statement schließt die Datei automatisch mit dem Fall, wenn der Code darunter eine Ausnahme auslöst. Trotz der Anwesenheit von interner Pufferung standardmäßig ist es immer noch unwirksam, jeweils ein Byte zu verarbeiten. Zum Beispiel, heres die blackhole. py Dienstprogramm, das alles isst, was es gegeben wird: 1,5 GBs mit dem Standard-Bufsize auf meinem Computer und nur 7,5 MBs, wenn bufsize1. Das heißt, es ist 200 mal langsamer, um ein Byte zu einer Zeit zu lesen. Berücksichtigen Sie es, wenn Sie Ihre Verarbeitung umschreiben können, um mehr als ein Byte zu einem Zeitpunkt zu verwenden und wenn Sie Leistung benötigen. Mmap ermöglicht es Ihnen, eine Datei als Bytearray und ein Dateiobjekt gleichzeitig zu behandeln. Es kann als Alternative zum Laden der gesamten Datei im Speicher dienen, wenn man Zugriff auf beide Schnittstellen benötigt. Insbesondere können Sie ein Byte zu einer Zeit über eine Memory-mapped Datei nur mit einer Ebene für - loop iterieren: mmap unterstützt Slice Notation. Zum Beispiel, mmi: ilen gibt len ​​Bytes aus der Datei beginnend an Position i zurück. Das Kontextmanagerprotokoll wird vor Python 3.2 nicht unterstützt. Sie müssen in diesem Fall explizit mm. close () aufrufen. Iterating über jedes Byte mit mmap verbraucht mehr Speicher als file. read (1). Aber mmap ist eine Größenordnung schneller. Antwortete 16. November 13 um 4:47 Um alle brillanten Punkte von chrispy, Skurmedel, Ben Hoyt und Peter Hansen zusammenzufassen, wäre dies die optimale Lösung für die Bearbeitung einer Binärdatei jeweils ein Byte: Für Python-Versionen 2.6 und höher, Weil: Python-Puffer intern - keine Notwendigkeit, Chunks zu lesen TROCKEN-Prinzip - nicht wiederholen die Lesezeile mit Anweisung stellt sicher, dass eine saubere Datei close byte wertet false aus, wenn es keine weiteren Bytes gibt (nicht wenn ein Byte null ist) oder verwenden Sie JF Sebastians Lösung Für verbesserte Geschwindigkeit Oder wenn du es als Generator-Funktion möchtest, wie durch Codepage demonstriert: beantwortet Sep 6 13 um 7:55 JFSebastian - Du bist 100 richtig - wahrscheinlich viel schneller ndash Holger Bille 9. Mai 16 um 8:12 Als die verknüpfte Antwort Sagt, das Lesen eines Bytes zu einer Zeit ist immer noch langsam in Python, auch wenn die Lesungen gepuffert sind. Die Leistung kann drastisch verbessert werden, wenn mehrere Bytes zu einem Zeitpunkt verarbeitet werden könnten wie im Beispiel in der verknüpften Antwort: 1.5GBs vs. 7.5MBs. Ndash J. F. Sebastian Wenn du viele Binärdaten zum Lesen hast, möchtest du das Strukturmodul betrachten. Es ist dokumentiert als Konvertierung zwischen C - und Python-Typen, aber natürlich sind Bytes Bytes, und ob diese als C-Typen erstellt wurden, spielt keine Rolle. Zum Beispiel, wenn Ihre Binärdaten zwei 2-Byte-Integer und eine 4-Byte-Ganzzahl enthalten, können Sie sie wie folgt lesen (Beispiel aus der Strukturdokumentation): Vielleicht finden Sie dies bequemer, schneller oder beides als explizit durchschleifen Der Inhalt einer Datei. Antwortete Jul 1 15 um 11:24 Lesen von Binärdateien in Python und Looping über jedes Byte Lets machen eine Datei: Jetzt läßt es über it, über das Rb-Flag (Lesemodus, Bytes-Modus) iterieren. Beachten Sie, dass die Multiple für Loops nicht erhöhen die Komplexität (die bleibt O (n)) - das ist nur, wie Sie faul iterate über eine Datei - Zeile für Zeile. Dies wird Schleife über jedes Byte im Code, ohne irgendwelche hacky. read (1) Geschäft. Das ist weit mehr pythonisch und natürlich als die while-Schleife und Komplikation, die ich in den anderen Antworten hier gesehen habe. Gepuffertes Lesen Wenn Sie große Dateien ohne Zeilenumbrüche haben, können Sie Ihre Lesung puffern. Python 2.7 erfordert io. open, um dies zu bekommen: Und wir haben jetzt einen gepufferten Leser: Python 3s builtin offene Funktion ist 2s io. open.

No comments:

Post a Comment