所以我试图将查询结果放在一个字符串中。让我们逐行说(顺便说一下,我不需要所有的字段),但这不是重点。我正在使用python对抗sqlite db。
问题是,当某些字段为null时,python将写入None而不是“”或一些空白的中性内容。
示例:
t = "%s %s %s %s" % (field[1],field[2],field[3],field[4])
如果field [3]例如为null,则t将类似于
"string1 string2 None string4"而不是
"string1 string2 string4"是的,我需要删除双空格以防万一。我不能只用“”替换“None”,因为某些字符串可能包含“None”,因为它是一个常用词。当然我没有4个字段,它们很多,而且我不是要尝试导入行的每个字段,只导入特定的字段。我需要一种快速简便的方法来解决这个问题。我无法手动检查每个字段是否为无,这是疯了。我无法使用
str.strip(field[i]),因为当该字段为“无”时,我会收到错误。
什么是好方法?
答案 0 :(得分:0)
如果“None”对于NULL字段是唯一的,则有 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'
答案 1 :(得分:0)
只使用非None
的字段
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)
答案 2 :(得分:0)
如果您可以控制select语句,则可以始终使用ifnull函数格式化任何可能的空值:
select
ifnull(fieldx, '') as fieldx
from table
这将确保返回的值是空字符串而不是空值。当然,如果你有很多潜在的空字段,这可能不实用。
如果这不起作用,我会说Raymond Hettinger的建议是最直接的方法。
答案 3 :(得分: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!