2016-06-15 7 views
0

Ich habe eine CSV-Datei, die Zeilen wie enthält:Spiel csv Daten mit RegExp, Python

{"Books \u3009 Arts & Photography \u3009 Sculpture \u3009 Appreciation": 342444, "Books": 4244234234875} 
{"Books \u3009 Science": 342864, "Books": 44242875} 
{"Books \u3009 Politics": 342444, "Books": 4135875} 

Ich brauche csv-Datei und Spiel lesen "Books": \d+, ich brauche nur diese Zahl, und steckte es in eine neue csv Datei

import csv 
import json 
import re 
with open('input.csv', 'rb') as infile: 
    with open('output.csv', 'wb',) as outfile: 
     reader = csv.reader(infile) 
     writer = csv.writer(outfile) 
     for line_num, line in enumerate(reader): 
      result = re.match(r'^"Books":(\d+)$', line[0]) 
      writer.writerow([result]) 

Aber der Code funktioniert nicht richtig, im Grunde erhalte ich leere Zellen, was bedeutet, dass ich nicht benötigten Daten übereinstimmen kann. Wenn ich mit .* übereinstimme, erhalte ich '< _sre.SRE_Match Objekt bei 0x028B2800>'. Versuchte verschiedene Ansätze, bitte drücken Sie mich in die richtige Richtung. Danke

+2

* Ist * das eine CSV-Datei? Mit den '{}' s sieht es mehr wie gebrochenes JSON aus, oder jemand hat gerade Wörterbuchliterale in eine Datei gedumpt. Beachten Sie, dass der Anfang eines Strings in Ihrem Fall '{' not '" Books "ist - was passiert, wenn Sie' line ([0]) 'drucken? Und warum hat ein 'SRE_Match'-Objekt Sie überrascht? passieren! – jonrsharpe

+0

'result.group (1)' und vielleicht 're.search' ist besser geeignet. –

+0

Wahrscheinlich ist der Grund, warum es nicht funktioniert, dass es ein Leerzeichen zwischen dem': 'und der Nummer gibt, für die Sie nicht verantwortlich sind das Muster, aber ich stimme jonrsharpe zu ... das sieht nicht nach einem guten Kandidaten für die Interpretation als CSV aus – glibdud

Antwort

0

Das ist keine CSV-Datei, sondern eine Reihe von JSON-Objekten zusammen. Sie scheinen alle gültig, so dass Sie sie einfach analysieren und die Daten, die Art und Weise extrahieren:

import csv 
import json 

with open('input.csv', 'r') as infile, open('output.csv', 'w') as outfile: 
    writer = csv.writer(outfile) 
    for line in infile: 
     num_books = json.loads(line.strip())['Books'] 
     writer.writerow([num_books]) 

in Python Getestet 3.4.

+0

Danke, dein Code hat mich zu etwas gebracht und mir wurde klar, dass die erste Zeile in der Datei nur eine Zeichenfolge (Name einer Spalte) war, und die ab der zweiten Zeile - JSON-Objekte beginnen, deshalb konnte ich nicht parsen Sie den JSON, da ich die erste Zeile und Parse von der Sekunde aus vermissen muss. Jetzt funktioniert der Code –