2016-12-08 12 views
0

Bis jetzt habe ich versucht, bestimmte Zeilen einschließlich Header aus der ursprünglichen CSV-Datei in eine neue zu kopieren. Sobald ich meinen Code ausführte, konnte ich jedoch ein riesiges Dokument kopieren.Kopieren bestimmter Zeilen von CSV in CSV in Python 2.7

Dies ist eine der Optionen, die ich bisher versucht haben, die in der Nähe von der Lösung zu sein scheint:

import csv 
with open('D:/test.csv', 'r') as f,open('D:/out.csv', 'w') as f_out: 
    reader = csv.DictReader(f) 
    writer = csv.writer(f_out) 
    for row in reader: 
     if row["ICLEVEL"] == "1": 
      writer.writerow(row) 

Die Sache ist, dass ich nur die Zeilen kopieren, wo Wert von „ICLEVEL“ (Kopfzeilenname) ist gleich "1".

Hinweis: test.csv ist sehr große Datei, und ich kann nicht alle Header-Namen im Writer fest codieren.

Jede Demonstration der pythonischen Art, dies zu tun, wird sehr geschätzt. Vielen Dank.

+0

Erhalten Sie einen Fehler? Was passiert mit Ihrer Lösung? – Hussain

+0

Wenn ich es laufe sagt es "Reihenfolge erwartet" und Punkte in der letzten Reihe. Allerdings, wenn ich mit writer.writerow ([row]) gehe, macht es eine totale Sauerei. –

+0

können Sie CSV-Daten Beispiel geben? –

Antwort

1

Ihr row ist ein Wörterbuch. CSV Writer kann keine Wörterbücher schreiben. Wählen Sie die Werte aus dem Wörterbuch und schreibe sie nur:

writer.writerow(reader.fieldnames) 
for row in reader: 
    if row["ICLEVEL"] == "1": 
    values = [row[field] for field in reader.fieldnames] 
    writer.writerow(values) 
+0

Sie haben einen tollen Job gemacht. Können Sie vorschlagen, Header auch zu kopieren? –

+0

Die erste Zeile meines Snippets kopiert die Header. – DyZ

+0

Es funktioniert leider nicht ... –

3

writer.writerow erwartet eine Folge (ein Tupel oder Liste). Sie können DictWriter verwenden, die eine dict erwartet.

import csv 
with open('D:/test.csv', 'r') as f, open('D:/out.csv', 'w') as f_out: 
    reader = csv.DictReader(f) 
    writer = csv.DictWriter(f_out, fieldnames=reader.fieldnames) 
    writer.writeheader() # For writing header 
    for row in reader: 
     if row['ICLEVEL'] == '1': 
      writer.writerow(row) 
+0

Danke für eine Anstrengung, aber es gab mir einen Schlüsselfehler ['ICLEVEL']. –

+0

Liest du die richtige Datei? – Hussain

+0

Ja, ich habe es noch einmal überprüft :( –

0

Ich würde tatsächlich nutzen Pandas, nicht einen CSV-Leser:

import pandas as pd 

df=pd.read_csv("D:/test.csv") 
newdf = df[df["ICLEVEL"]==1] 
newdf.to_csv("D:/out.csv",index=False) 

Der Code ist viel kompakter.

+0

I Ich bin nicht erlaubt, Pandas zu verwenden. Ihre vorherige Antwort war richtig, ich würde mich freuen, wenn Sie es wiederherstellen könnten. Danke. –

+1

Ok, ich sehe. Ich glaube @ Hussains Antwort ist eigentlich bette r. – DyZ

+0

Ich schätze seine Hilfe, aber es hat die Daten nicht gefiltert. –

Verwandte Themen