Python DBF: как связать индекс .cdx с таблицей .dbf - PullRequest
0 голосов
/ 31 мая 2018

Мне была поставлена ​​неоднозначная задача по автоматизации извлечения данных из различных таблиц Visual FoxPro.

Существует несколько пар файлов .DBF и .CDX.С пакетом Python dbf мне кажется, что я могу работать с ними.У меня есть два файла, ABC.DBF и ABC.CDX.Я могу загрузить файл таблицы, используя

>>> import dbf
>>> table = dbf.Table('ABC.DBF')
>>> print(table[3])
  0 - table_key : '\x00\x00\x04'
  1 - field_1   : -1
  2 - field_2   : 0
  3 - field_3   : 34
  4 - field_ 4  : 2
  ...

>>>

Насколько я понимаю, .cdx файлы являются индексами.Я подозреваю, что это соответствует полю table_key. По словам автора , dbf может читать индексы:

Я могу читать файлы IDX, но не обновлять их.Моя дневная работа изменилась, и файлы dbf не являются большой частью нового.- Итан Фурман 26 мая 16 года в 21: 05

Чтение - это все, что мне нужно сделать.Я вижу, что существует четыре класса: Idx, Index, IndexFile и IndexLocation.Это похоже на хороших кандидатов.

Класс Idx читает таблицу и имя файла, что многообещающе.

>>> index = dbf.Idx(table, 'ABC.CDX')

Хотя я не уверен, как использовать этот объект.Я вижу, что у него есть некоторые генераторы backward и forward, но когда я пытаюсь их использовать, я получаю сообщение об ошибке

>>> print(list(index.forward()))
dbf.NotFoundError: 'Record 67305477 is not in table ABC.DBF'

Как связать индексный файл .cdx с .dbf стол?

1 Ответ

0 голосов
/ 31 мая 2018

.idx и .cdx не совпадают, и dbf в настоящее время не может прочитать .cdx файлы.

Если вам нужно отсортировать таблицу, вы можете создать индекс в памяти:

my_index = table.create_index(key=lambda r: r.table_key)

Вы также можете создать полноценную функцию:

def active(rec):
    # do not show deleted records
    if is_deleted(rec):
        return DoNotIndex
    return rec.table_key

my_index = table.create_index(active)

и затем выполнить цикл по индексу вместо таблицы:

for record in my_index:
    ...
...