Сомневаюсь, что кому то данные материал пригодится, а также искренне надеюсь, что не пригодится. Ибо работать с 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'
дбф создавалось в нужной кодировке и нормально отображала кириллицу.