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'

AssertionError

Наистина не знам как да реша този проблем.


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\simpledbf\simpledbf.py". Ако това не работи, можете да ми изпратите ping на GitHub репо за simpledbf или можете да опитате с Ethan предложение за 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