2016-10-29 2 views
0

Ich bin neu in Python und auf der Suche nach einem Skript, das eine .csv-Datei neu formatiert. Also in meinen .csv-Dateien gibt es Zeilen, die nicht korrekt formatiert sind. Es sieht ungefähr so ​​aus:Neuformatierung .csv in Python: Zählen Kommas in einer Zeile und Einfügen von Zeilenumbrüchen nach einer bestimmten Anzahl von Kommas

id,author,text,date,id,author, 
text,date 
id,author,text,date 
id,author,text,date 

Es soll "ID, Autor, Text, Datum" auf jeder Zeile haben. Also war meine Idee, die Kommas in jeder Zeile zu zählen, und wenn eine bestimmte Zahl erreicht ist (in diesem Beispiel 4), wird der Rest am Anfang der nächsten Zeile eingefügt. Was ich habe ist folgende, die die Kommas in einer Reihe zählt:

import csv 
with open("test.csv") as f: 
    r = csv.reader(f) # create rows split on commas 
    for row in r: 
     com_count = 0 
     com_count += len(row) 
     print(com_count) 

Vielen Dank für Ihre Hilfe!

+0

Wie haben Sie am Ende mit so einer verschlüsselten CSV-Datei? Gibt es eine Möglichkeit, es vielleicht ohne diese Formatfehler wieder zu exportieren? – sobek

+0

Wie groß ist die Datei? Ich meine, kannst du die ganze Datei auf einmal lesen? –

Antwort

0

Wir werden einen Generator bauen, die Einträge und dann bauen die neuen Zeilen aus diesem

with open('oldfile.csv', newline='') as old: 
    r = csv.reader(old) 
    num_cols = int(input("How many columns: ")) 
    entry_generator = (entry for row in r for entry in row) 
    with open('newfile.csv', 'w+', newline='') as newfile: 
     w = csv.writer(newfile) 
     while True: 
      try: 
       w.writerow([next(entry_generator) for _ in range(num_cols)]) 
      except StopIteration: 
       break 

Das wird nicht funktionieren, wenn Sie eine Zeile haben, das fehlt Einträge ergibt.

Wenn Sie die Spaltenbreite immer programmatisch zu handhaben möchten, können Sie entweder wickeln diese in einer Funktion, die eine Breite als Eingabe verwendet, oder verwenden Sie die erste Zeile der CSV als kanonische Länge

Verwandte Themen