Python dbfpy и FoxPro - PullRequest
       53

Python dbfpy и FoxPro

4 голосов
/ 11 марта 2011

Хорошо, я здесь использую древний формат базы данных, dbf файлы.Не спрашивайте почему, просто знайте, что определенное программное обеспечение решило расширить поддержку foxpro, потому что Microsoft решила расширить поддержку foxpro.Теперь я получаю следующую ошибку в конкретном файле.Я успешно загрузил другой файл, и мне любопытно, если что-то не так с этой базой данных.Я уверен, что вам, вероятно, нужно взглянуть на базу данных, чтобы определить это, но это огромная возможность для публикации, поэтому я возьму то, что смогу получить.

Traceback (most recent call last):
  File "billsapi.py", line 250, in <module>
    x.getUsedGuns()
  File "billsapi.py", line 72, in getUsedGuns
    itemdb = dbf.Dbf('item.dbf', readOnly=True, ignoreErrors=True)
  File "C:\Python27\lib\site-packages\dbfpy\dbf.py", line 135, in __init__
    self.header = self.HeaderClass.fromStream(self.stream)
  File "C:\Python27\lib\site-packages\dbfpy\header.py", line 127, in fromStream
    _fld = fields.lookupFor(_data[11]).fromString(_data, _pos)
  File "C:\Python27\lib\site-packages\dbfpy\fields.py", line 455, in lookupFor
    return _fieldsRegistry[typeCode]
KeyError: '0'

И вот мой простой код, который возвращает эту ошибку:

def getUsedGuns(self): 
    itemdb = dbf.Dbf('item.dbf', readOnly=True, ignoreErrors=True) 

Как я уже сказал, я могу загрузить другие файлы без проблем, но, возможно, есть обходной путь дляэто конкретная ошибка?

РЕДАКТИРОВАТЬ: Я также хотел бы отметить, что файл можно открывать, просматривать и изменять в DBF View Plus.

РЕДАКТИРОВАТЬ: Решение найдено.Я фактически закончил с использованием модуля Python dBase.Я думаю, что моей главной проблемой было отсутствие файлов memo (какими бы они ни были, у них есть расширение файла .fpt).Вот что я использую в данный момент:

from dbf.tables import VfpTable
itemdb = VfpTable('item.db')
for rec in itemdb:
    print rec['MY_COLUM_NAME']

Я также хотел бы отметить, что любой, кто все еще использует FoxPro, должен быть сожжен.

Ответы [ 3 ]

2 голосов
/ 12 марта 2011

Ваш traceback - это способ, которым dbfpy сообщает вам, что ваш файл имеет код типа поля неподдерживаемого dbfpy, 0. Это Visual FoxPro ("VFP") вещь.

Это не имеет ничего общего с файлами заметок. Да, если есть памятные поля, они сохраняются в файле .FPT. foo.fpt должен присутствовать при доступе к foo.dbf.

Вы говорите "" "Я фактически использовал модуль Python dBase" "" ... возможно, вы имеете в виду модуль dbf Этана Фурмана, который согласно его записи PyPI не поддерживает нуль поля.

У меня есть модуль чтения DBF (pydbfrw), который я собирался выпустить "на днях". Вот выдержка из его документов:

Field Type      Description  DBF variety  Python 2.x type
0 (digit zero)  _NullFlags   VFP          N/A             

Notes: This field type is used only for the hidden _NullFlags field which
is a bit mask saying which fields in the record should be interpreted as NULL.

Мой модуль реализует распознавание этого и возвращение None для значения поля, где это необходимо. Если вы хотите получить копию модуля, найдите мой адрес электронной почты - например, google ("john machin xlrd") - напишите мне, и я отправлю его вам.

0 голосов
/ 14 марта 2011

Вам стоит взглянуть на Sybase Advantage Database Server . Этот продукт имеет отличную поддержку файлов VFP DBF. Я уже несколько лет использую их драйверы ODBC с Python через pyodbc, и получаю отличные результаты, используя недавно выпущенный DB-API 2.0-совместимый драйвер Python .

Меня тоже поставили в положение, когда я должен поддерживать таблицы DBF. Сервер баз данных Advantage был абсолютным спасителем.

0 голосов
/ 11 марта 2011

Возможно, что item.dbf использует более продвинутые возможности dbf, чем другие dbf. Например, целые числа с автоинкрементом были введены очень поздно и не поддерживаются большинством драйверов odbc.

...