如何避免查询结果为None?
我正在尝试把查询的结果放到一个字符串里。比如说,我想一行一行地处理(其实我并不需要所有的字段),但这不是重点。我是在用Python操作一个SQLite数据库。
问题是,当某些字段是空值(null)时,Python会写出“None”,而不是空字符串或者其他什么中性的东西。
举个例子:
t = "%s %s %s %s" % (field[1],field[2],field[3],field[4])
比如说,如果field[3]是空值,那么t的内容会像
"string1 string2 None string4"这样,而不是
"string1 string2 string4"。是的,我还需要在这种情况下去掉多余的空格。我不能简单地把“None”替换成空字符串,因为有些字符串本身可能就包含“None”,因为这个词很常见。当然,我的字段不止4个,还有很多,我并不是想导入每个字段,只想要特定的几个。我需要一个快速简单的方法来解决这个问题。我不能手动检查每个字段是否是None,这太疯狂了。我也不能使用
str.strip(field[i]),因为当字段是None时会报错。
那么,有什么好的解决办法吗?
4 个回答
0
如果你能控制你的选择语句,可以使用 ifnull 函数来处理可能出现的空值:
select
ifnull(fieldx, '') as fieldx
from table
这样做可以确保返回的值是一个空字符串,而不是空值。当然,如果你有很多可能为空的字段,这样做可能就不太实际了。
如果这样还不行,我觉得Raymond Hettinger的建议是最直接的方法。
0
只用那些不是 None
的字段来构建 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
如果“None”这个选项是专门用来处理空值的,可以使用 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'