2017-05-13 5 views
0

Ich habe eine CSV-Datei mit, sagen wir, 50 Zeilen von Daten, und ich würde es in separate CSV-Dateien für jede Zeile teilen, die erste Zeile enthält (Kopfzeile) und die entsprechende Zeile.CSV-Datei öffnen und jede Zeile in neue, dynamisch benannte CSV-Datei schreiben

z. Datei 1 enthält: row1, row2, Datei 2 enthält: row1, row3, Datei 3 enthält: row1, row4

Und so weiter.

Derzeit arbeitet er mit:

import csv 

counter = 1 

with open('mock_data.csv', 'r', newline='') as csvfile: 
    reader = csv.reader(csvfile) 
    for row in reader: 
     filename = "file_%s" % str(counter) 
     with open(filename, 'w') as csvfile_out: 
      writer = csv.writer(csvfile_out) 
      writer.writerow(row) 
      counter = counter + 1 

ich zur Zeit 'csvfile_out' nicht definiert zu bekommen.

a) Bin ich das auch schon richtig? b) Irgendwelche Ideen, warum csvfile_out nicht definiert wird?

Antwort

1

Ich habe dies versucht und es funktioniert gut für Ihren Zweck. Leider habe ich keine csvfile_out error und Ihre mit Anweisung funktioniert richtig in meiner Python 2.7.12 Konsole.

import csv 

counter = 1 

with open('mock_data.csv', 'r') as csvfile: 
    reader = csv.reader(csvfile) 
    row1 = next(reader) # here you save your first line of the .csv file 
    for row in reader: 
     if row: # if row is not empty, write a file with this row 
      filename = "file_%s" % str(counter) 
      with open(filename, 'w') as csvfile_out: 
       writer = csv.writer(csvfile_out) 
       writer.writerow(row1) #here you write your row1 as first row of csvfile_out 
       writer.writerow(row) 
       counter = counter + 1 
+0

Vielen Dank dafür. Der undefinierte Fehler war, dass ich dumm war. Was gut ist, weil ich definitiv nicht gedacht habe, dass irgendetwas mit dem Code nicht stimmt! –

+0

Follow-up: Ich habe ein seltsames Problem damit. Die 'writer.writerow (row)' wird in die dritte Zeile mit einer leeren Zeile dazwischen gelegt. Irgendwelche Ideen? –

+0

Ich denke, dass dieses Problem auftreten kann, wenn Sie leere Zeilen in Ihrer 'mock_data.csv' haben. Sie müssen leere Zeilen aus Ihrer 'mock_data.csv', [siehe hier] entfernen (http://stackoverflow.com/questions/4521426/delete-blank-rows-from-csv), oder Ihren Code einchecken, wenn Sie eine Zeile haben ist leer oder nicht (ich habe diese zweite Option in meine Antwort eingefügt, ich hoffe, das kann Ihr Problem beheben). – titiro89

0

Hier ist eine Lösung mit pandas. Nehmen wir den Inhalt von csv wie folgt:

Name, Age, Gender 
John, 20, Male 
Jack, 22, Male 
Jill, 18, Female 

Und mein Code wie folgt:

import pandas as pd 
df = pd.read_csv("mock_data.csv") 

for index, row in df.iterrows(): 
    file_name = row['Name']+".csv" #Change the column name accordingly 
    pd.DataFrame(row).T.to_csv(file_name, index=None) 

Dies wird Dateinamen erstellen auf der Grundlage der Werte der Spalte „Name“ (dh Jack, John und Jill) um drei Dateien zu erzeugen John.csv, Jack.csv und Jill.csv. Der Inhalt des John.csv ist wie folgt:

Name | Age | Gender | 
--------------------------- 
John | 20 | Male | 

Inhalt des Jack.csv ist wie folgt:

Name | Age | Gender | 
--------------------------- 
Jack | 22 | Male | 

Inhalt Jill.csv sich wie folgt:

Name | Age | Gender | 
--------------------------- 
Jill | 20 | Female | 

PS: Wenn Sie die Kopfzeile nicht möchten, fügen Sie einfachhinzu 10 beim Aufruf .to_csv() Funktion. Zum Beispiel:

pd.DataFrame(row).T.to_csv(file_name, index=None, Header=None) 
0

können Sie DictReader verwenden ...

import csv 

counter = 1 

with open('mock_data.csv', 'r') as csvfile: 
    reader = csv.DictReader(csvfile) 
    for row in reader: 
     filename = "file_%s" % str(counter) 
     with open(filename, 'w') as csvfile_out: 
     writer = csv.DictWriter(csvfile_out, fieldnames=reader.fieldnames) 
     headers = dict((n, n) for n in reader.fieldnames) 
     writer.writerow(headers) 
     writer.writerow(row) 
     counter = counter + 1 
Verwandte Themen