
Hallo habrozhiteli! Dieses Buch richtet sich an Personen, die bereits Erfahrung in einer oder mehreren Programmiersprachen haben und die Grundlagen von Python 3 so schnell und einfach wie möglich erlernen möchten. Es wird davon ausgegangen, dass der Leser bereits mit Kontrollstrukturen, OOP, Dateibehandlung, Ausnahmebehandlung usw. vertraut ist. Das Buch ist auch nützlich für Benutzer früherer Python-Versionen, die eine kompakte Python 3.1-Referenz benötigen.
Wir laden Sie ein, den Auszug "Verarbeiten von Datendateien" zu lesen.
Wie man ein Buch benutzt
Teil 1 enthält allgemeine Informationen zu Python. Sie erfahren, wie Sie Python herunterladen und auf Ihrem System installieren. Es bietet auch einen allgemeinen Überblick über die Sprache, der vor allem für erfahrene Programmierer nützlich ist, die ein umfassendes Verständnis von Python wünschen.
Teil 2 enthält das Hauptmaterial des Buches. Es werden die Zutaten erläutert, die erforderlich sind, um praktische Kenntnisse in der Verwendung von Python als universelle Programmiersprache zu erwerben. Das Material der Kapitel wurde so geplant, dass Leser, die gerade erst anfangen, Python zu lernen, nacheinander vorankommen und die wichtigsten Punkte der Sprache beherrschen können. Dieser Teil enthält auch komplexere Abschnitte, sodass Sie zurückkehren und alle erforderlichen Informationen zu einem bestimmten Design oder Thema an einem Ort finden können.
Teil 3 stellt die erweiterten Funktionen von Python vor - Sprachelemente, die nicht unbedingt erforderlich sind, aber für jeden ernsthaften Python-Programmierer nützlich sein werden.
Teil 4 konzentriert sich auf spezielle Themen, die über die einfache Syntax der Sprache hinausgehen. Sie können diese Kapitel lesen oder überspringen, je nach Ihren Anforderungen.
Python-Programmieranfänger werden aufgefordert, mit Kapitel 3 zu beginnen, um einen allgemeinen Eindruck zu hinterlassen, und dann zu den Kapiteln von Interesse in Teil 2 überzugehen. Führen Sie interaktive Beispiele ein, um Konzepte sofort zu vertiefen. Sie können auch über die im Text angegebenen Beispiele hinausgehen und nach Antworten auf noch unklare Fragen suchen. Dieser Ansatz erhöht die Lerngeschwindigkeit und vertieft das Verständnis. Wenn Sie mit OOP noch nicht vertraut sind oder es für Ihre Anwendung nicht erforderlich ist, können Sie den größten Teil von Kapitel 15 überspringen.
Leser, die bereits mit Python vertraut sind, sollten ebenfalls mit Kapitel 3 beginnen. Es bietet eine gute Einführung und eine Beschreibung der Unterschiede zwischen Python 3 und den bekannteren Versionen. Sie können damit auch bewerten, ob Sie bereit sind, mit den komplexeren Kapiteln der Teile 3 und 4 dieses Buches fortzufahren.
Möglicherweise können einige Leser, die keine Erfahrung mit Python haben, aber über ausreichende Erfahrung in anderen Programmiersprachen verfügen, die meisten erforderlichen Informationen erhalten, indem sie Kapitel 3 lesen und die Python-Standardbibliotheksmodule (Kapitel 19) und das Referenzhandbuch für die Python-Bibliothek in der Python-Dokumentation lesen .
Auszug. Datendateiverarbeitung
Die meisten Daten werden in Textdateien verteilt. Dies kann entweder unstrukturierter Text (z. B. eine Sammlung von Nachrichten oder eine Sammlung literarischer Texte) oder strukturiertere Daten sein, bei denen jede Zeile ein Datensatz ist und die Felder durch ein spezielles Trennzeichen getrennt sind - ein Komma, ein Tabulatorzeichen oder eine vertikale Leiste (|). Textdateien können sehr groß sein. Ein Datensatz kann zehn oder sogar Hunderte von Dateien belegen, und die darin enthaltenen Daten können unvollständig oder verzerrt sein. Bei einer solchen Vielfalt werden Sie fast unweigerlich auf die Aufgabe stoßen, Daten aus Textdateien zu lesen und zu verwenden. In diesem Kapitel werden die grundlegenden Strategien zur Lösung dieses Problems in Python vorgestellt.
21.1. Einführung in ETL
Die Notwendigkeit, Daten aus Dateien zu extrahieren, zu analysieren, in ein praktisches Format zu konvertieren und dann etwas zu tun, erschien fast gleichzeitig mit Datendateien. Darüber hinaus gibt es für diesen Prozess sogar einen Standardbegriff: ETL (Extract-Transform-Load, dh „Extraktion - Transformation - Laden“). Beim Abrufen wird eine Datenquelle gelesen und gegebenenfalls analysiert. Die Konvertierung kann das Bereinigen und Normalisieren von Daten sowie das Kombinieren, Aufteilen und Reorganisieren der darin enthaltenen Datensätze umfassen. Schließlich bedeutet Laden, die konvertierten Daten an einem neuen Ort (in einer anderen Datei oder Datenbank) zu speichern. In diesem Kapitel werden die Grundlagen der Implementierung einer ETL in Python erläutert, von Textdatendateien bis zum Speichern konvertierter Daten in anderen Dateien. Weitere strukturierte Datendateien werden in Kapitel 22 und die Speicherung von Informationen in einer Datenbank in Kapitel 23 erläutert.
21.2. Textdateien lesen
Die erste Komponente der ETL - Extraktion - umfasst das Öffnen einer Datei und das Lesen ihres Inhalts. Auf den ersten Blick klingt es einfach, aber auch hier können Probleme auftreten - zum Beispiel die Dateigröße. Wenn die Datei zu groß ist, um in den Speicher zu passen, muss der Code so strukturiert sein, dass er mit kleineren Segmenten der Datei (möglicherweise einer Zeile) funktioniert.
21.2.1. Textcodierung: ASCII, Unicode und andere
Ein weiteres mögliches Problem ist die Codierung. Dieses Kapitel widmet sich der Arbeit mit Textdateien. Tatsächlich wird ein großer Teil der in der realen Welt übertragenen Daten in Textdateien gespeichert. Die genaue Art des Textes kann jedoch je nach Anwendung, Benutzer und natürlich Land variieren.
Manchmal enthält der Text Informationen in ASCII-Codierung, einschließlich 128 Zeichen, von denen nur 95 als druckbar eingestuft sind. Glücklicherweise ist die ASCII-Codierung das "am wenigsten verbreitete Vielfache" der meisten Datenübertragungssituationen. Andererseits kann es die Komplexität der zahlreichen Alphabete und Schriftsysteme, die auf der Welt existieren, nicht bewältigen. Das Lesen von Dateien in ASCII-Codierung führt mit ziemlicher Sicherheit dazu, dass beim Lesen nicht unterstützter Zeichen, sei es Deutsch ü, Portugiesisch ç oder fast jedes Zeichen aus einer anderen Sprache als Englisch, Probleme auftreten und Fehler auftreten.
Diese Fehler treten auf, weil ASCII 7-Bit-Werte verwendet, während Bytes in einer typischen Datei aus 8 Bit bestehen, wodurch 256 mögliche Werte anstelle von 128 für 7-Bit-Werte dargestellt werden können. Diese zusätzlichen Codes werden normalerweise zum Speichern zusätzlicher Werte verwendet - von erweiterten Satzzeichen (z. B. mittleren und kurzen Strichen) bis zu verschiedenen Zeichen (Marke, Copyright-Zeichen und Gradzeichen) und Versionen von alphabetischen Zeichen mit diakritischen Zeichen. Es gab immer ein Problem: Beim Lesen einer Textdatei konnte ein Zeichen auftreten, das über den ASCII-Bereich von 128 Zeichen hinausging, und Sie konnten nicht sicher sein, welches Zeichen codiert war. Angenommen, Sie stoßen auf ein Zeichen mit dem Code 214. Was ist das? Eine Teilungsmarke, der Buchstabe Ö oder sonst etwas? Ohne den Quellcode, der diese Datei erstellt hat, ist es unmöglich, dies herauszufinden.
Unicode und UTF-8
Um diese Mehrdeutigkeit zu beseitigen, können Sie Unicode verwenden. Die Unicode-Codierung mit der Bezeichnung UTF-8 unterstützt grundlegende ASCII-Zeichen ohne Änderungen, ermöglicht jedoch auch eine nahezu unbegrenzte Anzahl anderer Zeichen und Zeichen aus dem Unicode-Standard. Aufgrund seiner Flexibilität wird UTF-8 in mehr als 85% der Webseiten verwendet, die zum Zeitpunkt dieses Schreibens existierten. Dies bedeutet, dass Sie sich beim Lesen von Textdateien am besten auf UTF-8 konzentrieren sollten. Wenn die Dateien nur ASCII-Zeichen enthalten, werden sie korrekt gelesen. Sie sind jedoch auch versichert, falls andere Zeichen in UTF-8 codiert sind. Glücklicherweise unterstützt der Python 3-String-Datentyp standardmäßig Unicode.
Selbst mit Unicode sind Situationen möglich, in denen Werte im Text angezeigt werden, die nicht erfolgreich dekodiert werden können. Die Öffnungsfunktion in Python erhält einen zusätzlichen Fehlerparameter, der bestimmt, wie mit Codierungsfehlern beim Lesen oder Schreiben von Dateien umgegangen wird. Der Standardwert ist 'strict', mit dem jedes Mal ein Fehler ausgelöst wird, wenn ein Codierungsfehler erkannt wird. Andere nützliche Werte sind 'ignorieren' (überspringen Sie das Zeichen, das den Fehler verursacht hat); 'ersetzen' (ein Zeichen wird normalerweise durch einen speziellen Marker ersetzt?); 'backslashreplace' (das Zeichen wird durch die Escape-Sequenz durch \ ersetzt) und 'surrogateescape' (das Eindringlingszeichen wird beim Lesen in einen privaten Unicode-Codepunkt konvertiert und beim Schreiben zurück in die ursprüngliche Byte-Sequenz). Die Wahl der Methode zur Verarbeitung oder Behebung von Codierungsfehlern hängt von der jeweiligen Situation ab.
Betrachten Sie ein kurzes Beispiel einer Datei mit einem ungültigen UTF-8-Zeichen und sehen Sie, wie dieses Zeichen in verschiedenen Modi verarbeitet wird. Schreiben Sie zuerst die Datei im Byte- und Binärmodus:
>>> open('test.txt', 'wb').write(bytes([65, 66, 67, 255, 192,193]))
Als Ergebnis des Befehls wird eine Datei aus den Zeichen "ABC" erstellt, gefolgt von drei Zeichen, die nicht in ASCII enthalten sind. Diese können je nach verwendeter Codierungsmethode unterschiedlich angezeigt werden. Wenn Sie die Datei mit vim anzeigen, sieht das Ergebnis folgendermaßen aus:
ABCÿÀÁ ~
Versuchen Sie beim Erstellen der Datei, sie im standardmäßigen strengen Fehlerbehandlungsmodus zu lesen:
>>> x = open('test.txt').read() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.6/codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
Das vierte Byte mit dem Wert 255 ist an dieser Position kein gültiges UTF-8-Zeichen, daher tritt im "strengen" Modus eine Ausnahme auf. Lassen Sie uns nun sehen, wie andere Fehlerbehandlungsmodi mit derselben Datei umgehen, ohne zu vergessen, dass die letzten drei Zeichen einen Fehler auslösen:
Wenn Sie möchten, dass die problematischen Zeichen einfach verschwinden, verwenden Sie den Modus "Ignorieren". Der Ersetzungsmodus markiert nur die Positionen ungültiger Zeichen, während andere Modi anders versuchen, ungültige Zeichen ohne Interpretation zu speichern.
21.2.2. Unstrukturierter Text
Unstrukturierte Textdateien werden am einfachsten gelesen, verursachen jedoch auch die meisten Probleme beim Extrahieren von Informationen. Die Verarbeitung von unstrukturiertem Text kann stark variieren, abhängig von der Art des Textes und dem, was Sie damit tun werden. Eine ausführliche Erörterung der Textverarbeitung würde daher den Rahmen des Buches sprengen. Ein kurzes Beispiel soll jedoch einige grundlegende Probleme aufzeigen und die Grundlage für die Erörterung von Dateien mit strukturierten Textdaten legen.
Eines der einfachsten Probleme ist die Auswahl der logischen Basiseinheit in der Datei. Wenn Sie eine Sammlung von Tausenden von Twitter-Nachrichten, Moby Dick-Text oder eine Sammlung von Nachrichten verwenden, müssen Sie diese irgendwie in Blöcke aufteilen. Bei Tweets kann jeder Block in einer Zeile platziert werden, und das Lesen und Verarbeiten jeder Zeile der Datei ist ganz einfach organisiert.
Im Fall von Moby Dick und sogar einigen Neuigkeiten wird das Problem immer komplizierter. Natürlich ist es normalerweise unerwünscht, den Text des Romans und sogar den Text der Nachrichten als eine Einheit zu betrachten. In diesem Fall müssen Sie entscheiden, welche Blöcke Sie benötigen, und dann eine Strategie zum Teilen der Datei in Blöcke entwickeln. Möglicherweise möchten Sie den Text Absatz für Absatz bearbeiten. In diesem Fall sollten Sie festlegen, wie die Aufteilung des Textes in Absätze in der Datei organisiert ist, und den Code entsprechend schreiben. Wenn die Absätze mit den Zeilen einer Textdatei übereinstimmen, ist dies nicht schwierig. Oft besteht ein Absatz einer Textdatei jedoch aus mehreren Zeilen in einer Textdatei, und Sie müssen hart arbeiten.
Betrachten Sie nun einige Beispiele.
Nenn mich Ishmael. Vor einigen Jahren - egal wie lange genau -
Ich habe wenig oder gar kein Geld in meiner Handtasche und nichts Besonderes
Um mich an Land zu interessieren, dachte ich, ich würde ein wenig segeln
und sehen Sie den wässrigen Teil der Welt. Es ist ein Weg, den ich habe
von der Milz zu vertreiben und den Kreislauf zu regulieren.
Immer wenn ich mich über den Mund grimmig fühle;
wann immer es ein feuchter, nieseliger November in meiner Seele ist; wann immer ich
finde mich unwillkürlich vor Sarglagern pausieren,
und die Rückseite jeder Beerdigung, die ich treffe, zur Sprache zu bringen;
und besonders wenn meine Hypos so die Oberhand über mich bekommen,
dass es ein starkes moralisches Prinzip erfordert, um mich davon abzuhalten
absichtlich auf die Straße treten und methodisch klopfen
Menschenhüte ab - dann halte ich es für höchste Zeit, zur See zu fahren
sobald ich kann. Dies ist mein Ersatz für Pistole und Ball.
Mit einem philosophischen Schwung wirft sich Cato auf sein Schwert;
Ich gehe leise zum Schiff. Daran ist nichts Überraschendes.
Wenn sie es nur wüssten, fast alle Männer in ihrem Abschluss, irgendwann
oder andere, schätzen fast die gleichen Gefühle gegenüber
der Ozean mit mir.
Jetzt gibt es Ihre Inselstadt der Manhattoes, die von Kais umgeben ist
als indische Inseln an Korallenriffen - der Handel umgibt sie mit ihrer Brandung.
Rechts und links führen Sie die Straßen ins Wasser. Es ist extrem in der Innenstadt
ist die Batterie, in der dieser edle Maulwurf von Wellen gewaschen und gekühlt wird
durch die Brise, die einige Stunden zuvor außer Sichtweite des Landes war.
Schauen Sie sich die Menge der Wassergucker dort an.
In diesem Beispiel (mit dem Anfang des Textes „Moby Dick“) werden Zeilen mehr oder weniger so unterbrochen, wie sie paginiert würden, und Absätze werden durch eine einzelne leere Zeile angezeigt. Wenn Sie jeden Absatz als Ganzes behandeln möchten, müssen Sie den Text in leere Zeilen aufteilen. Glücklicherweise kann diese Aufgabe leicht mit der split () -Methode von Strings ausgeführt werden. Jede neue Zeile im Text wird durch die Kombination "\ n" dargestellt. Natürlich endet die letzte Textzeile jedes Absatzes mit einer neuen Zeile, und wenn die nächste Textzeile leer ist, folgt unmittelbar darauf die zweite neue Zeile:

Das Parsen von Text in Absätze ist ein sehr einfacher Schritt bei der Verarbeitung von unstrukturiertem Text. Möglicherweise müssen Sie vor der weiteren Verarbeitung eine zusätzliche Normalisierung des Texts durchführen. Angenommen, Sie möchten die Häufigkeit des Auftretens jedes Wortes in einer Textdatei berechnen. Wenn Sie die Datei einfach nach Auslassungen aufteilen, erhalten Sie eine Liste der Wörter in der Datei. Das genaue Zählen der Vorkommen ist jedoch nicht so einfach, da dies, dies, dies. und dies wird nicht das gleiche Wort sein. Damit dieser Code ordnungsgemäß funktioniert, muss der Text normalisiert werden, indem vor der Verarbeitung Satzzeichen entfernt und der gesamte Text in einen Fall konvertiert werden. Im obigen Textbeispiel kann der Code zum Erstellen einer normalisierten Liste von Wörtern folgendermaßen aussehen:
21.2.3. Unstrukturierte begrenzte Dateien
Unstrukturierte Dateien werden sehr einfach gelesen, aber mangelnde Struktur ist auch ihr Nachteil. Es ist oft bequemer, eine Struktur für eine Datei zu definieren, um die Auswahl einzelner Werte zu vereinfachen. In der einfachsten Version ist die Datei in Zeilen unterteilt, und jede Zeile enthält ein Informationselement. Dies kann beispielsweise eine Liste von Dateinamen für die Verarbeitung, eine Liste von Personennamen oder eine Reihe von Temperaturmesswerten von einem Fernsensor sein. In solchen Fällen ist die Analyse der Daten sehr einfach organisiert: Sie lesen die Zeile und konvertieren sie gegebenenfalls in den gewünschten Typ. Dies ist alles, was Sie brauchen, um die Datei einsatzbereit zu machen.
Die Situation ist jedoch nicht so einfach. Häufiger müssen Sie mehrere miteinander verbundene Datenelemente gruppieren, und Ihr Code sollte sie zusammen lesen. In der Regel werden dazu verwandte Daten in einer Zeile platziert und durch ein Sonderzeichen getrennt. In diesem Fall werden beim Lesen jeder Zeile der Datei Sonderzeichen verwendet, um die Daten in Felder aufzuteilen und die Feldwerte zur weiteren Verarbeitung in Variablen zu speichern.
Die folgende Datei enthält Temperaturdaten in einem begrenzten Format:
State|Month Day, Year Code|Avg Daily Max Air Temperature (F)|Record Count for Daily Max Air Temp (F) Illinois|1979/01/01|17.48|994 Illinois|1979/01/02|4.64|994 Illinois|1979/01/03|11.05|994 Illinois|1979/01/04|9.51|994 Illinois|1979/05/15|68.42|994 Illinois|1979/05/16|70.29|994 Illinois|1979/05/17|75.34|994 Illinois|1979/05/18|79.13|994 Illinois|1979/05/19|74.94|994
Die Daten in der Datei werden durch eine Pipe (|) getrennt. In diesem Beispiel bestehen sie aus vier Feldern: Status, Beobachtungsdatum, durchschnittliche Maximaltemperatur und Anzahl der Stationen, die Daten liefern. Andere Standardtrennzeichen sind ein Tabulatorzeichen und ein Komma. Vielleicht wird das Komma am häufigsten verwendet, aber das Trennzeichen kann ein beliebiges Zeichen sein, das in den Werten nicht vorkommt (dazu später mehr). Durch Kommas getrennte Daten sind so häufig, dass dieses Format häufig als CSV (Comma-Separated Values, dh durch Kommas getrennte Daten) bezeichnet wird. Dieser Dateityp wird mit der Erweiterung .csv als Formatattribut bereitgestellt.
Unabhängig davon, welches Zeichen als Trennzeichen verwendet wird, können Sie, wenn Sie wissen, was das Zeichen ist, Ihren eigenen Python-Code schreiben, um die Zeichenfolge in Felder aufzuteilen und als Liste zurückzugeben. Im vorherigen Fall können Sie die Methode split () verwenden, um die Zeichenfolge in eine Liste von Werten zu konvertieren:
>>> line = "Illinois|1979/01/01|17.48|994" >>> print(line.split("|")) ['Illinois', '1979/01/01', '17.48', '994']
Diese Technik ist sehr einfach zu implementieren, aber alle Werte werden in Zeichenfolgenform gespeichert, und dies kann für die nachfolgende Verarbeitung unpraktisch sein.
21.2.4. CSV-Modul
Wenn Sie häufig begrenzte Datendateien verarbeiten müssen, sollten Sie sich das CSV-Modul und seine Funktionen genauer ansehen. Als ich gebeten wurde, mein Lieblingsmodul aus der Python-Standardbibliothek zu benennen, habe ich das CSV-Modul mehrmals aufgerufen - nicht weil es spektakulär aussieht (es ist nicht so), sondern weil es mir wahrscheinlich mehr Zeit und Zeit gespart hat von meinen möglichen Fehlern öfter als jedes andere Modul.
Das CSV-Modul ist das perfekte Beispiel für Pythons Philosophie „Batterie enthalten“. Obwohl Sie Ihren eigenen Code zum Lesen von begrenzten Dateien perfekt schreiben können (außerdem ist dies nicht so schwierig), ist die Verwendung des Python-Moduls viel einfacher und zuverlässiger. Das CSV-Modul wurde getestet und optimiert und bietet eine Reihe von Funktionen, die Sie selbst kaum implementieren könnten, die jedoch recht praktisch und zeitsparend sind.
Schauen Sie sich die vorherigen Daten an und entscheiden Sie, wie Sie sie mit dem CSV-Modul lesen möchten. Der Datenanalysecode sollte jede Zeile lesen und das nachfolgende Zeilenumbruchzeichen entfernen und dann die Zeile durch Zeichen | teilen und hängen Sie die Liste der Werte an die allgemeine Liste der Zeichenfolgen an. Die Lösung könnte ungefähr so aussehen:
>>> results = [] >>> for line in open("temp_data_pipes_00a.txt"): ... fields = line.strip().split("|") ... results.append(fields) ... >>> results [['State', 'Month Day, Year Code', 'Avg Daily Max Air Temperature (F)', 'Record Count for Daily Max Air Temp (F)'], ['Illinois', '1979/01/01', '17.48', '994'], ['Illinois', '1979/01/02', '4.64', '994'], ['Illinois', '1979/01/03', '11.05', '994'], ['Illinois', '1979/01/04', '9.51', '994'], ['Illinois', '1979/05/15', '68.42', '994'], ['Illinois', '1979/ 05/16', '70.29', '994'], ['Illinois', '1979/05/17', '75.34', '994'], ['Illinois', '1979/05/18', '79.13', '994'], ['Illinois', '1979/05/19', '74.94', '994']]
Wenn Sie dasselbe mit dem CSV-Modul tun möchten, sieht der Code möglicherweise folgendermaßen aus:
>>> import csv >>> results = [fields for fields in csv.reader(open("temp_data_pipes_00a.txt", newline=''), delimiter="|")] >>> results [['State', 'Month Day, Year Code', 'Avg Daily Max Air Temperature (F)', 'Record Count for Daily Max Air Temp (F)'], ['Illinois', '1979/01/01', '17.48', '994'], ['Illinois', '1979/01/02', '4.64', '994'], ['Illinois', '1979/01/03', '11.05', '994'], ['Illinois', '1979/01/04', '9.51', '994'], ['Illinois', '1979/05/15', '68.42', '994'], ['Illinois', '1979/ 05/16', '70.29', '994'], ['Illinois', '1979/05/17', '75.34', '994'], ['Illinois', '1979/05/18', '79.13', '994'], ['Illinois', '1979/05/19', '74.94', '994']]
In diesem einfachen Fall ist der Gewinn im Vergleich zur unabhängigen Implementierung der Lösung nicht so groß. Trotzdem stellte sich heraus, dass der Code zwei Zeilen kürzer und etwas klarer war, und Sie müssen sich keine Gedanken über das Abschneiden von Zeilenumbrüchen machen. Der eigentliche Vorteil ergibt sich aus komplexeren Fällen.
Die Daten in diesem Beispiel sind real, wurden jedoch in Wirklichkeit vereinfacht und gelöscht. Reale Daten aus der Quelle werden komplexer. Reale Daten enthalten mehr Felder, einige Felder werden in Anführungszeichen gesetzt, andere nicht, und das erste Feld ist möglicherweise leer. Das Original ist durch Tabulatoren getrennt, aber zu Demonstrationszwecken zitiere ich sie durch Kommas getrennt:
"Notes","State","State Code","Month Day, Year","Month Day, Year Code",Avg Daily Max Air Temperature (F),Record Count for Daily Max Air Temp (F),Min Temp for Daily Max Air Temp (F),Max Temp for Daily Max Air Temp (F),Avg Daily Max Heat Index (F),Record Count for Daily Max Heat Index (F),Min for Daily Max Heat Index (F),Max for Daily Max Heat Index (F),Daily Max Heat Index (F) % Coverage ,"Illinois","17","Jan 01, 1979","1979/01/ 01",17.48,994,6.00,30.50,Missing,0,Missing,Missing,0.00% ,"Illinois","17","Jan 02, 1979","1979/01/02",4.64,994,- 6.40,15.80,Missing,0,Missing,Missing,0.00% ,"Illinois","17","Jan 03, 1979","1979/01/03",11.05,994,- 0.70,24.70,Missing,0,Missing,Missing,0.00% ,"Illinois","17","Jan 04, 1979","1979/01/ 04",9.51,994,0.20,27.60,Missing,0,Missing,Missing,0.00% ,"Illinois","17","May 15, 1979","1979/05/ 15",68.42,994,61.00,75.10,Missing,0,Missing,Missing,0.00% ,"Illinois","17","May 16, 1979","1979/05/ 16",70.29,994,63.40,73.50,Missing,0,Missing,Missing,0.00% ,"Illinois","17","May 17, 1979","1979/05/ 17",75.34,994,64.00,80.50,82.60,2,82.40,82.80,0.20% ,"Illinois","17","May 18, 1979","1979/05/ 18",79.13,994,75.50,82.10,81.42,349,80.20,83.40,35.11% ,"Illinois","17","May 19, 1979","1979/05/ 19",74.94,994,66.90,83.10,82.87,78,81.60,85.20,7.85%
Bitte beachten Sie: Einige Felder enthalten Kommas. Gemäß den Regeln in solchen Fällen ist das Feld in Anführungszeichen eingeschlossen, um anzuzeigen, dass sein Inhalt nicht dazu bestimmt ist, Trennzeichen zu analysieren und zu suchen. In der Praxis (wie in diesem Fall) wird häufig nur ein Bruchteil der Felder in Anführungszeichen gesetzt, insbesondere diejenigen, deren Werte ein Trennzeichen enthalten können. Einige Felder sind jedoch (wie auch in diesem Beispiel) in Anführungszeichen eingeschlossen, auch wenn es unwahrscheinlich ist, dass sie ein Trennzeichen enthalten.
In solchen Fällen werden selbst entwickelte Lösungen zu umständlich. Jetzt funktioniert es nicht mehr, nur eine Linie durch ein Trennzeichen zu brechen. Sie müssen sicherstellen, dass Sie nur die Trennzeichen verwenden, die sich nicht in den Zeichenfolgen befinden. Außerdem müssen Sie die Anführungszeichen entfernen, die sich möglicherweise an einer beliebigen Stelle befinden oder nirgendwo gefunden werden. Mit dem CSV-Modul müssen Sie Ihren Code überhaupt nicht ändern. Da das Komma als Standardtrennzeichen betrachtet wird, muss es nicht einmal angegeben werden:
>>> results2 = [fields for fields in csv.reader(open("temp_data_01.csv", newline=''))] >>> results2 [['Notes', 'State', 'State Code', 'Month Day, Year', 'Month Day, Year Code', 'Avg Daily Max Air Temperature (F)', 'Record Count for Daily Max Air Temp (F)', 'Min Temp for Daily Max Air Temp (F)', 'Max Temp for Daily Max Air Temp (F)', 'Avg Daily Min Air Temperature (F)', 'Record Count for Daily Min Air Temp (F)', 'Min Temp for Daily Min Air Temp (F)', 'Max Temp for Daily Min Air Temp (F)', 'Avg Daily Max Heat Index (F)', 'Record Count for Daily Max Heat Index (F)', 'Min for Daily Max Heat Index (F)', 'Max for Daily Max Heat Index (F)', 'Daily Max Heat Index (F) % Coverage'], ['', 'Illinois', '17', 'Jan 01, 1979', '1979/01/01', '17.48', '994', '6.00', '30.50', '2.89', '994', '-13.60', '15.80', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'Jan 02, 1979', '1979/01/02', '4.64', '994', '-6.40', '15.80', '-9.03', '994', '-23.60', '6.60', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'Jan 03, 1979', '1979/01/03', '11.05', '994', '- 0.70', '24.70', '-2.17', '994', '-18.30', '12.90', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'Jan 04, 1979', '1979/01/04', '9.51', '994', '0.20', '27.60', '-0.43', '994', '-16.30', '16.30', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'May 15, 1979', '1979/05/15', '68.42', '994', '61.00', '75.10', '51.30', '994', '43.30', '57.00', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'May 16, 1979', '1979/05/ 16', '70.29', '994', '63.40', '73.50', '48.09', '994', '41.10', '53.00', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'May 17, 1979', '1979/05/17', '75.34', '994', '64.00', '80.50', '50.84', '994', '44.30', '55.70', '82.60', '2', '82.40', '82.80', '0.20%'], ['', 'Illinois', '17', 'May 18, 1979', '1979/05/18', '79.13', '994', '75.50', '82.10', '55.68', '994', '50.00', '61.10', '81.42', '349', '80.20', '83.40', '35.11%'], ['', 'Illinois', '17', 'May 19, 1979', '1979/05/19', '74.94', '994', '66.90', '83.10', '58.59', '994', '50.90', '63.20', '82.87', '78', '81.60', '85.20', '7.85%']]
»Weitere Informationen zum Buch finden Sie auf
der Website des Herausgebers»
Inhalt»
Auszug20% Rabatt-Gutschein für Straßenhändler -
Python