Как заставить python распознавать строковое значение в DBF как часть операторов if/else?

Я создаю программу для записи новых значений в dbf на основе разных условий, но у меня проблема с тем, что python не распознает текстовые значения как часть операторов if/else.

если у меня есть «col1», заполненный значениями true/false, и я хочу сказать:

my_table.add_fields('col2 N(2,0)')

for record in dbf.Process(my_table):
    if record.col1 == 'true':
        record.col2 = 1
    else: 
        record.col2 = 2

Как мне заставить python распознавать «истина/ложь» как значение как часть этого утверждения?


person wonderstruck80    schedule 11.12.2013    source источник
comment
Что произойдет, если вы просто используете if record.col1: или if bool(record.col1):?   -  person jonrsharpe    schedule 11.12.2013
comment
bool(), вероятно, не будет работать, так как я хочу иметь дело с текстовыми значениями, отличными от true/false, просто использовал true/false в моем примере для простоты. Я не понимаю, что вы имеете в виду, просто говоря, если запись.col1: для первой строки??   -  person wonderstruck80    schedule 11.12.2013
comment
Значит, col1 — это не просто 'true' и 'false'? Какую ошибку вы получаете с кодом, который вы разместили?   -  person jonrsharpe    schedule 11.12.2013
comment
Я не получаю никаких сообщений об ошибках. Что происходит, так это то, что python распознает строку 4 как ложную (независимо от значения true/false) и вводит «2» в col2.   -  person wonderstruck80    schedule 11.12.2013


Ответы (1)


Какой тип данных col1? Основные типы данных dbf: Char (текст), Date (дата-время), Logical (логическое значение), Number (целое/плавающее), Float (целое/плавающее) и Memo (неограниченный текст).

Если col1 не является полем Char, сравнение со строкой всегда будет возвращать False. Если col1 является полем Char, то оно будет сравниваться равным только тогда, когда col1 является точно «истинным», а не «истинным», «истинным» или «ИСТИННЫМ».

Если проблема в лишних пробелах (по умолчанию мой модуль возвращает все поле, включая конечные пробелы), вы можете сделать:

if record.col1.strip() == 'true':

или скажите dbf.Table использовать пользовательский тип Char, который игнорирует конечные пробелы:

my_table = dbf.Table('/path/to/file', default_data_types={'C':dbf.Char})
person Ethan Furman    schedule 11.12.2013
comment
странно, они оба, кажется, делают свое дело, хотя в моих значениях, похоже, вообще нет пробелов. Большое спасибо, Итан, я бы проголосовал в 5 раз, если бы я мог! - person wonderstruck80; 11.12.2013
comment
@ user21267: Итак, проголосуйте один раз и примите ответ (нажмите на зеленую галочку рядом с моим вопросом. ;) Причина, по которой возникает эта проблема, заключается в том, что если размер поля равен 7, возвращается true _ _ _ (где символы подчеркивания представляют собой пробелы). ). - person Ethan Furman; 11.12.2013
comment
Очевидно, недостаточно представителей, чтобы проголосовать :( и это имеет смысл. Спасибо, Итан. - person wonderstruck80; 11.12.2013