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