Создание DBF файла в Python 3

dbf11Сомневаюсь, что кому то данные материал пригодится, а также искренне надеюсь, что не пригодится. Ибо работать с dbf в наше то время как то грустно. На так как данный формат файла активно используется до сих пор 1с-сообществом, то иногда приходится иметь дело с  ним. Лично у меня заняло немало времени пока я сформирую валидный dbf файл.

Проблемы возникали практически на всех этапах. И если   с чтением dbf в питоне особых проблем нет, в частности тот же dbfread справляется на ура, да и документация отличная, то с созданием файла пришлось намучиться. На 2-ой питон много прекрасных библиотек для работы c dbf, но все они упорно не хотели становиться на 3-ий питон.

В конечном счете решил использовать одноименную библиотеку dbf.

Ниже приведу сам код создания dbf файла

def createOrderAjax(request):
    if request.method == 'POST':
        goods = json.loads(request.body.decode('utf-8'))
        kod = goods['massiv']['kod_klienta']

        kontragent = User.objects.get(username=kod)  # Получаем клиента
        order = Order.objects.create(  # Создаем заказ
            client=kontragent,
            payment_date=timezone.now(),
            comment="Создано электронно",
        )
        # Ниже добавляем товары к заказу
        for row in goods['massiv']['goods']:
            product = Goods.objects.create(
                kod=row['kod'],
                name=row['name'],
                proizvod=row['proizvod'],
                srok=row['srok'],
                kol=row['kol'],
                flag=row['flag'],
                price=row['price'],
                rprice=row['rprice'],
                nds=row['nds'],
                comment=row['comment'],
                ean13=row['ean13'],
                order=order
            )

        # Формируем dbf и шлем заявку на сервер заявок
        table = dbf.Table('or.dbf',
                          'kod C(30); name C(200); proizvod C(100); srok C(10);  kol N(10, 0); quant N(10, 0); fasovka C(10); flag N(1, 0); price N(10, 2); rprice N(10, 2); nds N(2, 0); comment C(100); ean13 C(13)',
                          codepage='cp866')
        table.open()
        for row in goods['massiv']['goods']:
            datum = (row['kod'], row['name'], row['proizvod'], row['srok'],
                     row['kol'], 0, '0', BoolNumeric(row['flag']), row['price'], row['rprice'],
                     row['nds'], row['comment'], row['ean13'])
            table.append(datum)
        table.close()

    return JsonResponse({'msg': order.pk})


def BoolNumeric(logic):
    if logic == 'true':
        return 1
    else:
        return 0

Думаю код в комментариях не нуждается, в общем то все просто, но учитывая что документация у библиотеки совсем никакая пришлось копаться в исходниках. Отдельно отмечу возню с кодировками, так как разработка велась в Виндовс окружении.

Только при указании

codepage='cp866'

дбф создавалось в нужной кодировке и нормально отображала кириллицу.

Добавить комментарий

Ваш e-mail не будет опубликован.