Wie python csv-Modul für die Aufteilung von doppelten Rohr getrennten Daten verwenden

Ich habe Daten, die aussieht:

"1234"||"abcd"||"a1s1" 

Ich versuche zu lesen und zu schreiben mit Python's csv Leser und Schriftsteller. Da das csv-Modul-Trennzeichen auf Single Char beschränkt ist, gibt es irgendeine Möglichkeit, Daten sauber abzurufen? Ich kann es mir nicht leisten, die leeren Säulen zu entfernen, da es ein massiv riesiger Datensatz ist, der zeitlich begrenzt verarbeitet werden soll. Irgendwelche Gedanken sind hilfreich.

4 Solutions collect form web for “Wie python csv-Modul für die Aufteilung von doppelten Rohr getrennten Daten verwenden”

Die Docs und das Experimentieren beweisen, dass nur einstellige Begrenzer erlaubt sind.

Da cvs.reader jedes Objekt akzeptiert, das das Iterator-Protokoll unterstützt, können Sie die Generator-Syntax verwenden, um || zu ersetzen -s mit | -s, und dann füttere diesen Generator dem Leser:

 def read_this_funky_csv(source): # be sure to pass a source object that supports # iteration (eg a file object, or a list of csv text lines) return csv.reader((line.replace('||', '|') for line in source), delimiter='|') 

Dieser Code ist ziemlich effektiv, da er auf einer CSV-Leitung zu einem Zeitpunkt arbeitet, vorausgesetzt, dass Ihre CSV-Quelle Zeilen liefert, die Ihren verfügbaren RAM nicht überschreiten 🙂

Leider ist Trennzeichen durch einen Charakter in C dargestellt. Das bedeutet, dass es unmöglich ist, dass es etwas anderes als ein einziges Zeichen in Python ist. Die gute Nachricht ist, dass es möglich ist, die Werte zu ignorieren, die null sind:

 reader = csv.reader(['"1234"||"abcd"||"a1s1"'], delimiter='|') #iterate through the reader. for x in reader: #you have to use a numeric range here to ensure that you eliminate the #right things. for i in range(len(x)): #Odd indexes will be discarded. if i%2 == 0: x[i] #x[i] where i%2 == 0 represents the values you want. 

Es gibt andere Möglichkeiten, dies zu erreichen (eine Funktion könnte geschrieben werden, für eine), aber das gibt Ihnen die Logik, die benötigt wird.

 >>> import csv >>> reader = csv.reader(['"1234"||"abcd"||"a1s1"'], delimiter='|') >>> for row in reader: ... assert not ''.join(row[1::2]) ... row = row[0::2] ... print row ... ['1234', 'abcd', 'a1s1'] >>> 

Wenn Ihre Daten buchstäblich wie das Beispiel aussieht (die Felder enthalten nie '||' und sind immer zitiert), und Sie können die Anführungszeichen tolerieren oder sind bereit, sie später abzuschneiden, verwenden Sie einfach .split

 >>> '"1234"||"abcd"||"a1s1"'.split('||') ['"1234"', '"abcd"', '"a1s1"'] >>> list(s[1:-1] for s in '"1234"||"abcd"||"a1s1"'.split('||')) ['1234', 'abcd', 'a1s1'] 

Csv wird nur benötigt, wenn das Trennzeichen innerhalb der Felder gefunden wird oder um optionale Anführungszeichen um Felder zu löschen

  • Kann ich eine CSV-Datei importieren und automatisch das Trennzeichen ableiten?
  • Python ist die beste Programmiersprache der Welt.