2016-07-26 145 views
0

我有几个.csv包含NULL值的文件,这些值在表中被视为空。例如:用'0'替换列表中的值

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

.csv文件输入到我的程序,并转换为这样的名单:

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

基本上发生在csvFile每一行,并将其转化值的列表,看起来是这样的:

['0', '383', '', '0']['1', '383', '1', '383]

请注意,NULL值现在只是空字符串,''

然后,在相对于上述removeNull()程序的snipet定义为:

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

看起来通过列表(又名行)为空字符串,'',并注意到其索引为nullIndex。然后删除所述索引处的空字符串,将其替换为'0'并返回编辑后的列表。

问题:到底是什么毛病我removeNull()功能,导致它只能更换第一个空字符串,'',在列表中?我该如何解决这个问题,以便它适用于列表中的所有空字符串?

为了便于说明,这样的表格只有一个NULL每行的值或空字符串转换为列表后,工作得很好。

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

['0', '383', '', '0']工作正常。

但是,如果我有这样的一个表,与多个每行NULL值,它只会替换转换列表中的第一个空字符串,什么也不做,其余的。

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

['0', '', '', '0']不能正常工作。

+1

'NEWROW = row.insert( ...)'看上去很腥......'row.insert'应该返回'None'。 – mgilson

+0

不需要单独的功能。只需在循环中添加一行:'用于csvFile中的行:row = [item if item else'0'for item in row]' –

+0

@StevenRumbalski这不是很明显,因为我上面说过,但我需要单独功能用于该程序的其他元素。然而,你的答案是完全正确的,所以谢谢你。 – ThoseKind

回答

5

因为list.index只返回列表中项目第一次出现的索引。您可以改用每行一个列表理解做替换:

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

列表理解的三元运算符替换空白字符串与'0'同时,因为它们是其他人返回。

在一个侧面说明,你的函数不修改row就地,因此,你需要将函数的返回值赋给row

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