Как мне избежать None в результате запроса? - PullRequest
0 голосов
/ 31 октября 2011

Итак, я пытаюсь поместить результат запроса в строку. Допустим, строка за строкой (кстати, мне не нужны все поля), но это не главное. Я использую Python против базы данных sqlite.

проблема в том, что когда некоторые поля равны нулю, 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 полей, их много, и я не пытаюсь импортировать все поля строки, только определенные. Мне нужен быстрый и простой способ исправить это поведение. Я не могу вручную проверить, является ли каждое поле None, это безумие. Я не могу использовать
str.strip(field[i])
, потому что, когда поле None, я получаю ошибку.

что может быть хорошим подходом?

Ответы [ 4 ]

0 голосов
/ 01 ноября 2011

Это будет делать то, что вы говорите, что хотите:

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 голосов
/ 31 октября 2011

Сформируйте sql только с полями, которые не 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)
0 голосов
/ 31 октября 2011

Если у вас есть контроль над оператором select, вы всегда можете использовать функцию ifnull для форматирования любых возможных нулевых значений:

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

Это будет гарантировать, что возвращаемое значениепустая строка, а не нулевое значение.Конечно, это может быть нецелесообразно, если у вас много потенциальных пустых полей.

Если это не сработает, я бы сказал, что предложение Рэймонда Хеттингера - самый прямой метод.

0 голосов
/ 31 октября 2011

Существует опция str.replace , если «None» уникально для полей NULL:

>>> "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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...