Wie liest man die csv-Datei richtig, wenn jede Zeile eine andere Anzahl von Feldern enthält (Zahl ziemlich groß)?

8

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!

    
user5779223 11.02.2016, 16:07
quelle

6 Antworten

11

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:

%Vor%

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.

    
Martin Evans 11.02.2016, 16:42
quelle
4

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.

%Vor%

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%     
chthonicdaemon 06.06.2016 06:05
quelle
2

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?

%Vor%

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.

    
atkat12 11.02.2016 16:20
quelle
2

Ich denke, der beste Ansatz ist die Verwendung von pandas read_csv :

%Vor%

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:

%Vor% %Vor%     
jezrael 12.02.2016 06:58
quelle
2

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() :

%Vor%

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.)

%Vor%

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.

    
alexis 11.06.2016 21:01
quelle
1

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%     
Gerhard Hagerer 11.02.2016 16:25
quelle

Tags und Links