2016-06-03 3 views
0

Ich bin neu bei Python, also bitte verzeih mir. Ich habe dies durch Dinge zusammengefügt, die ich online gefunden habe, aber es funktioniert immer noch nicht so, wie es sollte.Python-Skript zum Säubern von .csv-Datei basierend auf Array-Werten

Ich möchte ein Python-Skript, das in einer bestimmten Tabelle (list.csv) aussehen wird, parse es für alle "key_words", dann exportiert eine Datei nur der Zeilen, die KEINE "key_words" enthalten " cleaned.csv ". Ich möchte dafür nur in die erste Spalte schauen, [0]. Wenn möglich, möchte ich dafür auch ein zweites Tabellenkalkulationsprogramm, das Keywords enthält, exportieren, nur um zu überprüfen, was es auskratzt.

Dieser aktuelle Code betrachtet die gesamte CSV-Datei und ich sehe es einige Zeilen nicht in "cleaned.csv" setzen, wenn technisch, sollte es sein, es sei denn, es gibt ein Problem mit meinem Array. Hier

ist meine aktuellen Code ...

key_words = [ 'Dog', 'Cat', 'Bird', 'Cow', ] 

with open('list.csv') as oldfile, open('cleaned.csv', 'w') as newfile: 
    for line in oldfile: 
     if not any(key_word in line for key_word in key_words): 
      newfile.write(line) 

ersten paar Zeilen von Daten sind ...

Dog,Walks,Land,4legs, 
Fish,Swims,Water,fins, 
Kangaroo,Hops,Land,2legs, 
Cow,Walks,Land,4legs, 
Bird,Flies,Air,2legs, 

Cleaned.csv zeigen sollte:

Fish,Swims,Water,fins, 
Kangaroo,Hops,Land,2legs, 

Andere. csv (schlechtes, übereinstimmendes Array) sollte anzeigen:

Dog,Walks,Land,4legs, 
Cow,Walks,Land,4legs, 
Bird,Flies,Air,2legs, 
+0

Mögliche Duplikat [Read Spezifische Spalten aus der csv-Datei mit Python csv] (http://stackoverflow.com/questions/16503560/read-specific-columns-from-csv-file-with-python-csv) – tripleee

+0

@tripleee OP weiß nicht, wie man es benutzt wenn conditionals – Merlin

Antwort

1

Nun Code sieht gut aus und funktionierte für mich, so dass es kein Problem damit an sich ist.

Wenn Sie nur in der ersten Reihe überprüfen wollen, müssen Sie die Zeile geteilt „“:

key_words = ['Dog', 'Cat', 'Bird', 'Cow', ] 

with open('list.csv') as oldfile, open('cleaned.csv', 'w') as cleaned, open("matched.csv", "w") as matched: 
    for line in oldfile: 
     if not any(key_word in line.split(",", 1)[0] for key_word in key_words): 
      cleaned.write(line) 
     else: 
      matched.write(line) 

Wenn erste Spalte ist immer ein ‚Wort‘ und nicht ein ‚Satz‘ (wie Dog is out) Dann könnten Sie den Test wie folgt verbessern:

if not line.split(",", 1)[0] in key_words: 

HINWEIS: mit Strings Test vorsichtig sein mit Groß-/Kleinschreibung.

Beachten Sie, dass eine Bereitstellung von maxsplit=1 hier line.split(",", 1) String Parsen Leistung verbessern, besonders wenn Sie längere Linien haben, weil es nach dem Auffinden ersten , Parsen zu stoppen und eine Liste von 2 Artikel zurückgeben. Der erste Artikel wird Ihre erste Spalte sein.Lesen Sie hier mehr:

https://docs.python.org/2/library/stdtypes.html#str.split

TESTERGEBNIS:

mac: cat list.csv 
Dog,Walks,Land,4legs, 
Fish,Swims,Water,fins, 
Kangaroo,Hops,Land,2legs, 
Cow,Walks,Land,4legs, 
Bird,Flies,Air,2legs, 

mac: cat cleaned.csv 
Fish,Swims,Water,fins, 
Kangaroo,Hops,Land,2legs, 

mac: cat matched.csv 
Dog,Walks,Land,4legs, 
Cow,Walks,Land,4legs, 
Bird,Flies,Air,2legs, 
+0

Ich denke, ich verstehe, was Sie sagen. Kann ich Ihnen zur besseren Aufklärung eine Nachricht schicken? – CFraley

+0

@CFraley sicher. Froh, dass ich Helfen kann. –

+0

@CFraley Ich denke, dass Sie Ruf von 20 haben müssen, um zu plaudern: http://stackoverflow.com/help/privileges/chat. Aber Sie können Ihre Fragen hier in Kommentaren zur Antwort posten. Denken Sie auch über die Verwendung von https://docs.python.org/2/library/csv.html für all Ihre csv-Dateiverarbeitungsanforderungen in Zukunft nach. –

0

ist hier eine reine pandas Methode:

In [51]: 
key_words = [ 'Dog', 'Cat', 'Bird', 'Cow'] 
t="""Dog,Walks,Land,4legs 
Fish,Swims,Water,fins 
Kangaroo,Hops,Land,2legs 
Cow,Walks,Land,4legs 
Bird,Flies,Air,2legs""" 
df = pd.read_csv(io.StringIO(t), header=None) 
df 

Out[51]: 
      0  1  2  3 
0  Dog Walks Land 4legs 
1  Fish Swims Water fins 
2 Kangaroo Hops Land 2legs 
3  Cow Walks Land 4legs 
4  Bird Flies Air 2legs 

wir können eine RegexMuster erstellen und übergeben diese an str.contains und negieren Die boolesche Bedingung zum Maskieren des DF vor dem Aufruf to_csv:

In [55]:  
pat = '|'.join(key_words) 
df[df.apply(lambda x: ~x.str.contains(pat).any(), axis=1)] 

Out[55]: 
      0  1  2  3 
1  Fish Swims Water fins 
2 Kangaroo Hops Land 2legs 

So verwenden wir apply mit param axis=1 unsere Lambda reihenweise anzuwenden, wir die negierte str.contains mit any zu testen, ob jede Spalte nicht unsere Schlüsselwörter enthält:

In [56]: 
df.apply(lambda x: ~x.str.contains(pat).any(), axis=1) 

Out[56]: 
0 False 
1  True 
2  True 
3 False 
4 False 
dtype: bool 
Verwandte Themen