2016-06-08 10 views
1

Ich habe viele von CSV-Dateien als solche formated:Regex Separatoren mit read_csv() in Python verwenden?

date1::tweet1::location1::language1 

date2::tweet2::location2::language2 

date3::tweet3::location3::language3 

und so weiter. Einige Dateien enthalten bis zu 200.000 Tweets. Ich möchte 4 Felder extrahieren und sie in einen Pandas-Datenrahmen einfügen sowie die Anzahl der Tweets zählen. Hier ist der Code Ich verwende jetzt:

try: 
    data = pd.read_csv(tweets_data_path, sep="::", header = None, engine='python') 
    data.columns = ["timestamp", "tweet", "location", "lang"] 
    print 'Number of tweets: ' + str(len(data)) 

except BaseException, e : 
    print 'Error: ',str(e) 

ich die folgende Fehlermeldung auf mich geworfen bekommen

Error: expected 4 fields in line 4581, saw 5 

Ich habe versucht Einstellung error_bad_lines = False, manuell die Zeilen zu löschen, die das Programm Fehler machen, Einstellung nrows zu einer niedrigeren Nummer .. und immer noch diese "erwarteten Felder" Fehler für zufällige Zeilen. Sagen wir, ich lösche die untere Hälfte der Datei, ich bekomme den gleichen Fehler aber für Zeile 1787. Was für mich keinen Sinn ergibt, da es vorher korrekt verarbeitet wurde. Durch die visuelle Überprüfung der CSV-Dateien werden keine abnormalen Muster sichtbar, die plötzlich in der fehlerhaften Zeile erscheinen.

Die Datumsfelder und Tweets enthalten Doppelpunkte, URLs und so weiter, also könnte Regex sinnvoll sein (Ich habe gerade begonnen, Python zu verwenden, bitte mit mir ..)?

Kann mir jemand helfen herauszufinden, was ich falsch mache? Vielen Dank im Voraus!

bearbeiten: Auswahl der Daten, wie unten angefordert:

Fri Apr 22 21:41:03 +0000 2016::RT @TalOfer: Barack Obama: Brexit would put UK back of the queue for trade talks [short url] #EuRef #StrongerIn::United Kingdom::en 

Fri Apr 22 21:41:07 +0000 2016::RT @JamieRoss7: It must be awful to strongly believe in Brexit and be watching your campaigns make an absolute horse's arse of it.::The United Kingdom::en 

Fri Apr 22 21:41:07 +0000 2016::Whether or not it rains on June 23rd will have more influence on the vote than Obama's lunch with the Queen and LiGA with George. #brexit.::Dublin, Ireland::en 

Fri Apr 22 21:41:08 +0000 2016::FINANCIAL TIMES FRONT PAGE: 'Obama warns Brexit vote would send UK to 'back of trade queue' #skypapers [short url]::Mardan, Pakistan::en 
+0

/@ Benutzer starten durch Entfernen der "Motor". Und, bitte fügen Sie tatsächliche Datenprobe .5-10 Reihen hinzu. – Merlin

+0

Hallo Merlin und danke für die Antwort! Das Entfernen der Engine gibt mir eine "ParserWarning-Fallback-to-Python-Engine, weil die 'C-Engine Regex-Separatoren nicht unterstützt". Ich habe das OP mit aktuellen Daten bearbeitet – user2763524

Antwort

0

beginnen mit diesem:

pd.read_csv(tweets_data_path, sep="::", header = None, usecols = [0,1,2,3]) 

Die oben sollte in 4 Spalten bringen, dann können Sie herausfinden, wie viele Zeilen fallen gelassen wurden, und wenn die Daten sinnvoll ist.

Verwenden Sie dieses Muster:

data["lang"].unique() 

Da haben Sie Problem mit Daten und nicht, wo es ist. Sie müssen zurücktreten und python 'csv reader' verwenden. Dies sollte Ihnen den Einstieg erleichtern.

import csv 
reader = csv.reader(tweets_data_path) 
tweetList = [] 
for row in reader: 
    try: 
     tweetList.append( (row[0].split('::'))) 
    except BaseException, e : 
     print 'Error: ',str(e) 

print tweetList 

tweetsDf = pd.DataFrame(tweetList) 



print tweetsDf 
            0 \ 
    0 Fri Apr 22 21:41:03 +0000 2016 
    1 Fri Apr 22 21:41:07 +0000 2016 
    2 Fri Apr 22 21:41:07 +0000 2016 
    3 Fri Apr 22 21:41:08 +0000 2016 

                 1     2  3 
0 RT @TalOfer: Barack Obama: Brexit would put UK...  United Kingdom en 
1 RT @JamieRoss7: It must be awful to strongly b... The United Kingdom en 
2 Whether or not it rains on June 23rd will hav...    Dublin None 
3 FINANCIAL TIMES FRONT PAGE: 'Obama warns Brexi...    Mardan None 
+0

Probieren Sie es aus, der gleiche Fehler .. danke für Ihre Hilfe bisher, Hallo geschätzt viel – user2763524

+1

, ich war in der Lage, das Problem zu beheben, indem die Angabe:. index_col = [0,1,2,3], usecols = [0,1,2,3] in read_csv eine Verwendung oder der andere funktioniert nicht als eigenständiges Programm.Vielen Dank für deine Hilfe, das war ein kleiner Fehler. – user2763524

0

Haben Sie versucht read_table statt? Ich habe diese Art von Fehler, wenn ich versuchte, read_csv vorher zu verwenden, und ich löste das Problem, indem ich es verwendete. Bitte beachten Sie diese post, dies könnte Ihnen einige Ideen geben, wie Sie den Fehler beheben können. Und versuchen Sie vielleicht auch sep=r":{2}" als Trennzeichen.

+0

Vielen Dank für Ihre Antwort! Ich versuchte read_table und änderte den sep-Wert zu dem, was Sie vorgeschlagen, sowie die anderen Vorschläge in dem Thread, den Sie verlinkt .. immer noch in das gleiche Problem :( – user2763524