2016-07-26 13 views
0

Ich habe ein paar .csv Dateien, die NULL Werte enthalten, die in der Tabelle als leer angesehen werden. Zum Beispiel:Ersetzen von Werten in einer Liste durch '0'

ID Volts Current Watts 
0 383    0 
1 383  1   383 
2 382  2   764 

Diese .csv Datei eingegeben wird in meinem Programm und in eine Liste wie folgt aus:

with open(inputPath + file) as inFile: 
    csvFile = csv.reader(inFile) 
    for row in csvFile: 
     removeNull(row) 
     print(row) 

, die im wesentlichen jede Zeile in csvFile nimmt und verwandelt es in eine Liste von Werten, die aussieht so etwas wie dieses:

['0', '383', '', '0'], ['1', '383', '1', '383] usw.

Beachten Sie, dass die Werte NULL jetzt nur leere Zeichenfolgen sind, ''.

def removeNull(row): 
    nullIndex = row.index('') 
    row.remove('') 
    newRow = row.insert(nullIndex, '0') 
    return newRow 

, die in der Liste (aka Reihe) für leere Strings sehen durch, '', und stellen fest, dessen Index als nullIndex:

Dann in Bezug auf die snipet des Programms über removeNull() ist definiert als. Entfernt dann die leere Zeichenfolge an dem Index, ersetzt sie durch '0' und gibt die bearbeitete Liste zurück.

Frage: Was genau ist falsch mit meiner removeNull() Funktion, die es verursacht nur ersetzt die erste leere Zeichenkette, '', in einer Liste? Und wie kann ich es reparieren, so dass es für alle leeren Strings in einer Liste funktioniert?

Zur Verdeutlichung, eine Tabelle wie diese mit nur einenNULL Wert pro Zeile oder leere Zeichenfolge, sobald in eine Liste konvertiert, funktioniert gut.

ID Volts Current Watts 
0 383    0 
1 383  1   383 
2 382  2   764 

['0', '383', '', '0']funktioniert gut.

Allerdings, wenn ich eine Tabelle wie diese habe, mit mehrereNULL Werten pro Zeile, es wird nur die erste leere Zeichenfolge in der konvertierten Liste ersetzen und mit dem Rest nichts tun.

ID Volts Current Watts 
0      0 
1 383  1   383 
2 382  2   764 

['0', '', '', '0']nicht gut funktionieren.

+1

'newRow = row.insert (...) 'sieht mir faul aus ...' row.insert' sollte 'None' zurückgeben. – mgilson

+0

Keine separate Funktion erforderlich. Fügen Sie einfach eine Zeile zu Ihrer Schleife hinzu: 'für Zeile in csvFile: Zeile = [Element wenn Element sonst '0' für Element in Zeile] ' –

+0

@StevenRumbalski Es ist nicht sehr offensichtlich, wie ich oben erwähnt habe, aber ich brauche das separate Funktion für andere Elemente des Programms. Aber Ihre Antwort ist völlig richtig, also danke trotzdem. – ThoseKind

Antwort

5

Da list.index nur Index des ersten Auftretens des Elements in der Liste zurückgibt. Sie können stattdessen eine Liste Verständnis in jeder Zeile verwenden, um den Ersatz zu tun:

def removeNull(row): 
    return ['0' if i=='' else i for i in row] 
    #  |<- ternary op. ->| 

Der ternäre Operator in der Liste Verständnis leere Strings mit '0' ersetzt, während andere zurückgeführt werden, wie sie sind.

Auf einer Seite zur Kenntnis, Ihre Funktion ändert nicht rowin-place daher müssen Sie den Rückgabewert der Funktion row zuordnen:

for row in csvFile: 
    row = removeNull(row) 
    print(row) 
Verwandte Themen