2017-03-22 1 views
1

Ich habe eine große CSV-Datei, die ich bearbeiten möchte. Die Bearbeitung bedeutet hier das Löschen der Spalten, die nur einen Wert haben. Bisher schrieb ich dies (da ich einen Neuling in Python bin ich bin stecken und nicht sicher, ob das die richtige Lösung für das Problem ist):Bearbeiten von CSV mit Python

import csv 
import collections 
import numpy as np 


number_of_rows = 2432 
interseting_cols = [] 

col_values = collections.defaultdict(list) 
col_values_named = collections.defaultdict(list) 
new_row = collections.defaultdict(list) 
inputFile = open('input.csv', 'r',newline=''); 
outputFile= open('output.csv','w') 

reader = csv.reader(inputFile) 
writer = csv.writer(outputFile) 
#skip field names 
next(reader) 
for row in reader: 
    for col, value in enumerate(row): 
     col_values[col].append(value) 
     #each column is now saved col_values (without the headers) 


for i in range(len(col_values)): 
    if len(set(col_values[i][:(number_of_rows-1)])) != 1: 
     interseting_cols.append(i)# saved the index of the columns with valid values 

inputFile.seek(0) 

# reading the file again now with headers 
for row in reader: 
    for col, value in enumerate(row): 
     col_values_named[col].append(value)# saving the columns now with header 


# generating a new CSV file, only with interessting columns : 
for i in range(number_of_rows): 
    print("i value ",i) 
    for j in range(len(interseting_cols)): # I'm not sure about this PART !!!! 
      new_row.append(col_values_named[interseting_cols[j]]) 
      writer.writerow(new_row) 

Jede Idee, wie die letzte Schleife zu tun? Oder gibt es einen besseren Weg, dies zu lösen?

UPDATE sagen, dass die Datei wie

--------------------------------------------------- 
      |A|B |C |D |F |G|H |I|J |K |  
--------------------------------------------------- 
1   |1|NULL|444 |201|0.01|A|NULL|4|9.5|NULL|  
--------------------------------------------------- 
2   |2|NULL|NULL|201|0 |A|NULL|4|9.5|NULL| 
--------------------------------------------------- 
3   |4|NULL|444 |201|0 |A|NULL|4|9.5|NULL| 
--------------------------------------------------- 
4   |1|NULL|444 |201|0 |A|NULL|4|9.5|NULL| 

in diesem Fall sieht das Ergebnis nur nur drei Spalten enthalten sollte A, C und F

+1

Könnten Sie die Frage bearbeiten, um eine kleine Probe aus der CSV-Datei enthalten, und auch, wie Sie es später erscheinen soll. –

+1

Als Tipp gibt es eine Bibliothek namens Pandas, die sehr nützlich beim Lesen, Bearbeiten und Schreiben von Daten ist –

Antwort

1

Pandas Bibliothek verwenden, können Sie reduzieren all Ihre zusätzliche Arbeit durch eigene eingebaute Funktionen. Hier ist eine kleine Implementierung der oben angegebenen Anforderung. Wenn Sie ein Anfänger sind und etwas mehr klare Erklärungen brauchen, pingen Sie mich im Kommentar und sind bereit, ein wenig mehr Informationen zu geben. Übrigens, fangen Sie an, mit Pandas herumzuspielen.

+1

danke für Ihre Antwort, aber wie kann ich die Header in den ersten Zeilen ignorieren? – Engine

+0

Beim Schreiben in CSV ?? tun Sie einfach ** df.to_csv ('output.csv', index = Keine, header = False) ** –

+0

nicht beim Lesen, denn wenn die Überprüfung die Header enthält, wird es nie löschen Spalte – Engine

0

Wenn die Tabelle nicht wirklich riesig ist, lesen Sie einfach die ganze Sache und finden Sie dann, was Sie wollen!

Ungeprüfte Code:

headers = reader.next() 
sheet = [] 
for row in reader: 
    sheet.append(row) 

# assuming all rows are the same length ... 
for colno,header in enumerate(headers): 
    col = [ row[colno] for row in sheet ] 
    distinct = set(col) 
    if len(distinct) > 1: 
     # col contains at least two distinct values, so 
     # do something with it and its header and/or column number 
     writer.writerow( [header, colno] + col)