2013-04-17 46 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

我將不得不在晚些時候進行研究。感謝你們兩個,最終的解決方案可能已經接近。 –