2013-04-17 41 views
0

为了处理多个CSV文件的内容,我必须从string-list-elements中过滤几个字符,最值得注意的是NULL值。为此,我尝试了几种来自网络的解决方案。其中之一是以下功能:不删除空值(Python)

def removeNull(rawString): 
    l = filter("\u0000", list(rawString)) 
    newString = ''.join(l) 
    printUtil.printAll(newString, "\n") 
    return newString 

但是,它总是给我TypeError: 'str' object is not callable,终止程序。更复杂的解决方案并没有给我一个错误,但他们完全没有改变,NULL值仍然存在。

此外,如果我通过\u0000与其他任何值交换,但None(这不会导致更改),我会收到相同的错误消息。

希望有人能为我解决这个问题,因为经过4或5个小时的反复试验后,我的想法已经过时。

谢谢您的回答和建议!

解决问题:

错误消息源自一个事实,那我用"\u0000"作为论据的过滤功能的构建。该特定问题的焦点两种有效的解决方案,在经过了必要的功能:

l = filter(lambda x: x != '\u0000',rawString) 

l = filter(lambda x:ord(x) != 0, list(rawString)) 

回答

1

filter期望第一个参数是函数(或更准确地说callable)。然后迭代第二个参数,将每个参数传递给函数。在函数返回一个类似False的值的地方,它会在输出中跳过。

你可以尝试:

l = filter(lambda x: x != '\u0000',rawString) 
+0

这将删除空值。但是,对于给定的输入,它之后会返回乱码。我不知道为什么编写文件的过滤内容与原始文件以及控制台输出完全不同,因为只应删除空值。如果需要,我可以上传我的输入和输出文件,以更清楚地了解发生了什么。编辑:Joran Beasleys解决方案也是如此。 –

+0

对于一些澄清:进入删除函数的字符串行为像一个字节数组时,将其保存到一个文件,至少我必须进入二进制写入模式。不幸的是,我不太了解这个结果,但至少现在它可行。 –

0
l = filter(lambda x:ord(x) != 0, list(rawString)) 

应该更好地工作

,使之更加透明

def is_not_null(ch): 
    return ch != u'\u0000' 

print filter(is_not_null,list(rawString)) 
+0

结果似乎是在控制台窗口中正确的,但是保存这一个文件时,有意想不到的问题(见我respont到mgilson的解决方案)。 –

+0

以及我怀疑这是由字符编码造成的不同问题... –

+0

我将不得不在晚些时候进行研究。感谢你们两个,最终的解决方案可能已经接近。 –