2011-10-31 103 views
0

所以我試圖把查詢的結果放在一個字符串中。我們一行一行地說(我不需要所有的字段),但那不是重點。我對一個SQLite數據庫使用Python。如何避免查詢結果爲無?

問題是,當一些字段爲空時,python將寫入None而不是「」或一些空白的中性事物。

例如:

t = "%s %s %s %s" % (field[1],field[2],field[3],field[4]) 

如果場[3]爲空例如,T將會像

"string1 string2 None string4"
,而不是
"string1 string2 string4"
是我還需要去除的情況下,雙空間。我不能用「」替換「None」,因爲一些字符串可能包含「None」,因爲它是一個常見詞。當然,我沒有隻有4場,他們很多,我不是試圖導入該行的每一個領域,只有特定的領域。我需要一種快速而簡單的方法來解決這個問題。我無法手動檢查每個字段是否爲無,這是瘋了。我不能使用
str.strip(field[i])
,因爲當該字段爲無時,我得到一個錯誤。

什麼可能是一個好方法?

+0

爲什麼你不能檢查每個字段的「無」?它是速度問題還是編碼問題?如果這是一個編碼問題,你應該可以在一個循環中完成。 –

+0

,因爲它是很多領域。我不明白爲什麼%s將「無」字符串中的Nonetype轉換爲None。我只是想避免這個 – Danny

回答

0

還有就是str.replace選項,如果 「無」 是唯一的空字段:

>>> "string1 string2 None string4".replace('None ', '') 
'string1 string2 string4' 

或者,您可以預先篩選的字符串:

>>> fields = ['string0', 'string1', 'string2', None, 'string4'] 
>>> fields_out = filter(lambda f: f is not None, fields[1:]) 
>>> template = ' '.join('%s' for field in fields_out) 
>>> template % tuple(fields_out) 
'string1 string2 string4' 
+0

這是行不通的。如果string2 =「我的朋友都沒有」呢?即使我不應該這樣做,我也會替換「無」。 – Danny

+0

這就是爲什麼我給你第二個選項來預先過濾替代之前的字段。 –

+0

或者'fields_out = [如果字段不是None的字段中字段的字段]''。或者,如果您不介意刪除任何評估爲「bool(False)」的內容,則「[field for field in field in field]]」。 –

0

形式與SQL

names=('col1','col2','col3') 
fields=... 
data=dict((n,f) for n,f in zip(names,fields) if f is not None) 
condition=' AND '.join('{n} = ?'.format(n=n) for n in data) 
sql='''SELECT {n} FROM table 
     WHERE {c} 
     '''.format(n=','.join(data.keys()),c=condition) 
args=data.values() 
cursor.execut(sql,args) 
+0

我實際上並沒有插入數據。我執行一個選擇。空值在Python中被None轉換,如果我使用%s創建一個字符串,我會得到我不想要的單詞「None」。 – Danny

0

如果你哈:僅在非None領域已經控制了你的SELECT語句,你總是可以使用ifnull功能格式化任何潛在的空值:

select 
    ifnull(fieldx, '') as fieldx 
from table 

這將確保返回的值是一個空字符串,而不是空值。當然,如果你有很多潛在的空字段,這可能是不實際的。

如果這不起作用,我會說雷蒙德赫廷格的建議是最直接的方法。

0

這會對你說什麼,你想做的事:

t = " ".join("%s" % x for x in your_tuple if x is not None) 

既然你不想多餘的空格,這將是一個好主意,除去零長度字符串也:

t = " ".join("%s" % x for x in your_tuple if x is not None and x != "") 

實施例:

>>> your_tuple = ('foo', None, '', 0, 1, 'bar') 
>>> " ".join("%s" % x for x in your_tuple if x is not None) 
'foo 0 1 bar' 
>>> " ".join("%s" % x for x in your_tuple if x is not None and x != "") 
'foo 0 1 bar' 

警告filter(None, your_data)是不是一個好主意:

>>> filter(None, your_tuple) 
('foo', 1, 'bar') # Whoops! 
+0

另一個答案的平凡變體。 –

+0

@RaymondHettinger:對你來說微不足道,對你來說不重要。 –

+0

不幸的是,這有助於如果我想將整個元組導入到一個字符串中。我只需要特定的領域。我現在正在做的是將它們全部列出來,並檢查是否所有人都是None。蠻力的方式 – Danny