Ich habe eine Textdatei von Amazon, die folgende Informationen enthält:
%Vor%Wie Sie sehen, sind die Daten durch Leerzeichen getrennt, und in jeder Zeile gibt es eine unterschiedliche Anzahl von Spalten. Allerdings ist es der Textinhalt. Hier ist der Code, den ich versucht habe:
%Vor%Und solch ein Fehler tritt auf:
%Vor%Als ich versuchte, alle Spalten zu lesen:
%Vor%Und der Fehler ist diesmal:
%Vor%Und wenn der Überprüfungstext in vielen Zeilen so lang ist, fügt die Methode zum Hinzufügen von Header-Namen für jede Spalte in diesem Frage kann nicht funktionieren.
Ich frage mich, wie ich die CSV-Datei lesen soll, wenn ich den Review-Text behalten und sie jeweils überspringen möchte. Vielen Dank im Voraus!
BEARBEITEN:
Das Problem wurde von Martin Evans perfekt gelöst. Aber jetzt spiele ich mit einem anderen Datensatz mit ähnlichem, aber anderem Format. Jetzt ist die Reihenfolge der Daten umgekehrt:
%Vor%Haben Sie eine Idee, es richtig zu lesen? Es wäre für jede Hilfe dankbar!
Wie vorgeschlagen, kann DictReader
auch wie folgt verwendet werden, um eine Liste von Zeilen zu erstellen. Dies könnte dann als ein Rahmen in Pandas importiert werden:
Dies würde Folgendes anzeigen:
%Vor%Wenn die Überprüfung am Anfang der Zeile angezeigt wird, besteht ein Ansatz darin, die Zeile wie folgt zu analysieren:
%Vor%Dies würde anzeigen:
%Vor% row[::-1]
wird verwendet, um den Text der gesamten Zeile umzukehren, die [2:]
überspringt die Zeilenendung, die jetzt am Anfang der Zeile steht. Jede Zeile wird dann auf Leerzeichen aufgeteilt. Ein Listenverständnis kehrt dann jeden Teileintrag erneut um. Schließlich wird rows
an den ersten angehängt, indem die festen 5 Spalteneinträge (jetzt am Anfang) genommen werden. Die verbleibenden Einträge werden dann mit einem Leerzeichen zusammengefügt und als letzte Spalte hinzugefügt.
Der Vorteil dieses Ansatzes besteht darin, dass er nicht darauf angewiesen ist, dass Ihre Eingabedaten in einem Format mit exakt fester Breite vorliegen, und Sie müssen sich keine Sorgen machen, wenn sich die verwendeten Spaltenbreiten im Laufe der Zeit ändern.
Es sieht so aus, als wäre dies eine Datei mit fester Breite. Pandas liefert read_fwf
für genau diesen Zweck. Der folgende Code liest die Datei korrekt für mich. Vielleicht möchten Sie etwas mit den Breiten herumspielen, wenn es nicht perfekt funktioniert.
Wenn die Spalten immer noch mit der bearbeiteten Version übereinstimmen (wobei die Bewertung an erster Stelle steht), müssen Sie nur die richtige Spezifikation hinzufügen. Eine Leitlinie wie die folgende hilft, dies schnell zu tun:
%Vor%So wird der neue Befehl:
%Vor% Usecols
bezieht sich auf den Namen der Spalten in der Eingabedatei. Wenn Ihre Datei diese Spalten nicht wie folgt benannt hat ( user, item, rating
), weiß sie nicht, auf welche Spalten Sie sich beziehen. Stattdessen sollten Sie einen Index wie usecols=[0,1,2]
übergeben.
Auch names
bezieht sich auf das, was Sie die importierten Spalten nennen. Also, ich denke du kannst beim Import von 3 Spalten nicht vier Namen haben. Funktioniert das?
Der Tokenisierungsfehler sieht wie ein Problem mit dem Trennzeichen aus. Es könnte versuchen, Ihre Spalte review text
so viele Spalten zu analysieren, weil "ich" "liebe" "dieses" ... alle durch Leerzeichen getrennt sind. Hoffentlich können Sie, wenn Sie nur die ersten drei Spalten lesen, vermeiden, einen Fehler zu werfen, aber wenn nicht, könnten Sie in Erwägung ziehen, Zeile für Zeile zu analysieren (zum Beispiel hier: Ссылка ) und Schreiben von dort auf einen Datenrahmen.
Ich denke, der beste Ansatz ist die Verwendung von pandas
read_csv
:
Wenn Sie alle Spalten benötigen, benötigen Sie eine Vorverarbeitung, um die maximale Länge der Spalten für den Parameter usecols
zu erstellen und anschließend die letzten Spalten mit der Nachbearbeitung zu verknüpfen:
Da die ersten vier (jetzt die letzten vier) Felder niemals Leerzeichen enthalten oder von Anführungszeichen umgeben sein müssen, vergessen wir die csv-Bibliothek und verwenden direkt die pythonartige String-Behandlung. Hier ist ein Einzeiler, der jede Zeile in genau fünf Spalten aufteilt, mit dem Argument maxsplit
an rsplit()
:
Das obige sollte Ihr Problem lösen, aber ich ziehe es vor, es in eine Generatorfunktion zu packen, die leichter zu verstehen ist und bei Bedarf erweitert werden kann:
%Vor% Beide Versionen vermeiden es, ein großes gewöhnliches Array im Speicher zu erstellen, nur um es dem DataFrame
-Konstruktor zu übergeben. Wenn jede Eingabezeile aus der Datei gelesen wird, wird sie analysiert und sofort dem Datenrahmen hinzugefügt.
Das obige ist für das Format in der aktualisierten Frage, die den freien Text auf der linken Seite hat. (Verwenden Sie für das ursprüngliche Format line.split
anstelle von line.rsplit
und entfernen Sie das letzte Feld, nicht das erste.)
Je nachdem, wie die Daten tatsächlich aussehen, können Sie noch mehr tun: Wenn die Felder durch genau vier Leerzeichen getrennt sind (wie in Ihrem Beispiel zu sehen ist), können Sie auf " "
aufteilen, anstatt auf alle Leerzeichen zu teilen. Das funktioniert auch korrekt, wenn einige andere Felder Leerzeichen enthalten können. Im Allgemeinen ist das Vorparsen so flexibel und erweiterbar; Ich lasse den Code einfach, da es keine Beweise aus deiner Frage gibt, dass mehr benötigt wird.
Ich würde über jede Zeile iterieren und die aufeinanderfolgenden Leerzeichen durch Semikolon ersetzen. Rufen Sie dann str.split () auf und wählen Sie Semikolon als Trennzeichen. Es könnte wie folgt aussehen:
%Vor%