DBF - кодировка cp1250

У меня есть база данных dbf, закодированная в cp1250, и я читаю эту базу данных, используя следующий код:

import csv
from dbfpy import dbf
import os
import sys

filename = sys.argv[1]
if filename.endswith('.dbf'):
    print "Converting %s to csv" % filename
    csv_fn = filename[:-4]+ ".csv"
    with open(csv_fn,'wb') as csvfile:
        in_db = dbf.Dbf(filename)
        out_csv = csv.writer(csvfile)
        names = []
        for field in in_db.header.fields:
            names.append(field.name)
        #out_csv.writerow(names)
        for rec in in_db:
            out_csv.writerow(rec.fieldData)
        in_db.close()
        print "Done..."
else:
  print "Filename does not end with .dbf"

Проблема в том, что окончательный файл csv неверен. Кодировка файла ANSI, некоторые символы повреждены. Я хотел бы спросить вас, можете ли вы помочь мне, как правильно читать файл dbf.

ИЗМЕНИТЬ 1

Я пробовал другой код из https://pypi.python.org/pypi/simpledbf/0.2.4, есть ошибка.

Источник 2:

from simpledbf import Dbf5
import os
import sys

dbf = Dbf5('test.dbf', codec='cp1250');
dbf.to_csv('junk.csv');

Выход:

python program2.py
Traceback (most recent call last):
  File "program2.py", line 5, in <module>
    dbf = Dbf5('test.dbf', codec='cp1250');
  File "D:\ProgramFiles\Anaconda\lib\site-packages\simpledbf\simpledbf.py",      line 557, in __init__
    assert terminator == b'\r'

Ассертионеррор

Я действительно не знаю, как решить эту проблему.


person Krivers    schedule 07.07.2015    source источник


Ответы (3)


Попробуйте использовать мою библиотеку dbf:

import dbf
with dbf.Table('test.dbf') as table:
    dbf.export(table, 'junk.csv')
person Ethan Furman    schedule 07.07.2015

Я написал simpledbf. Строка, которая вызывает у вас проблемы, была результатом некоторого тестирования, которое я проводил при разработке модуля. Прежде всего, вы можете обновить свою установку, так как 0.2.6 является самой последней. Затем вы можете попробовать удалить эту конкретную строку (# 557) из файла «D:\ProgramFiles\Anaconda\lib\site-packages\simplebf\simplebf.py». Если это не сработает, вы можете связаться со мной через репозиторий GitHub для simpledbf или попробовать предложение для модуля dbf.

person Ryan    schedule 08.07.2015
comment
Это тоже работает. Спасибо за ответ. :) Просто ошибка в пустом поле. ValueError: тип столбца еще не поддерживается. - person Krivers; 08.07.2015

Вы можете декодировать и кодировать по мере необходимости. dbfpy предполагает, что строки закодированы utf8, поэтому вы можете декодировать, поскольку это не та кодировка, а затем снова кодировать с правильной кодировкой.

import csv
from dbfpy import dbf
import os
import sys

filename = sys.argv[1]
if filename.endswith('.dbf'):
    print "Converting %s to csv" % filename
    csv_fn = filename[:-4]+ ".csv"
    with open(csv_fn,'wb') as csvfile:
        in_db = dbf.Dbf(filename)
        out_csv = csv.writer(csvfile)
        names = []
        for field in in_db.header.fields:
            names.append(field.name)
        #out_csv.writerow(names)
        for rec in in_db:
            row = [i.decode('utf8').encode('cp1250') if isinstance(i, str) else i for i in rec.fieldData]
            out_csv.writerow(rec.fieldData)
        in_db.close()
        print "Done..."
else:
  print "Filename does not end with .dbf"
person caiohamamura    schedule 25.01.2017