dbf
отличается от большинства других пакетов DB тем, что вместо получения полностью отдельной структуры данных (например, набор строк как кортежей) вы работаете непосредственно с самим файлом dbf.
Проблема, с которой я столкнулась, заключалась в том, что когда я обновлял сразу несколько полей:
record.name = 'Some Name'
record.age = current_year -birth_year
record.hair_color = base_color * sun_tint
, если ошибка произошла в любое время после первого поля, у меня была запись, которая была только частично обновлена, и потому что он больше не является внутренне непротиворечивым.
Чтобы обойти эту проблему, я добавил код, который является видом как фиксация на основе записи, а способ его активации - с with
или с помощью Process
:
with record: # capture current values
record.field1 = something
record.field2 = something_else
record.field3 = another_thing
# now some other code
Теперь, если произошла ошибка, исходные значения восстанавливаются; если ошибка не возникает, новые значения сохраняются в таблице dbf
на диске.
Кроме with
в записи, вы также можете использовать Process
в связке записей, или вы могли бы избегайте проблемы и собирайте данные за пределами записи, а затем пишите все сразу:
for record in table:
new_data = {}
new_data['field1'] = 'a name'
new_data['field2'] = an_age
dbf.write(record, new_data)
Итак, чтобы вернуться к вашему коду, самый простой способ его исправить:
with dbf.Table("aa.dbf") as table:
for record in dbf.Process(table):
record[3] = 200
Он что-то делает. Вы просто не видите, что он делает, потому что вы ничего не делаете с выводом unknown. Попробуйте заменить
unknown('qwerty')
на
print(unknown('qwerty'))
и посмотрите, что вы получите.
Редактировать: Похоже, в вашем вопросе есть опечатка:
word=word[:i-1]+word[i]+word[i-1]+word[i+1]
, скорее всего, должно быть:
word=word[:i-1]+word[i]+word[i-1]+word[i+1:]
Это изменение должно сделать рекурсивную пузырьковую сортировку. [ 119]