2015-07-07 34 views
6

Mam bazy danych DBF zakodowane w cp1250 i czytam tę bazę danych przy użyciu kodu folowing:DBF - kodowania 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" 

Problem w tym, że końcowy plik CSV jest źle. Kodowanie pliku to ANSI i niektóre znaki są uszkodzone. Chciałbym Cię zapytać, czy możesz mi pomóc poprawnie odczytać plik dbf.

EDIT 1

Próbowałem inny kod z https://pypi.python.org/pypi/simpledbf/0.2.4 istnieje jakiś błąd.

Źródło 2:

from simpledbf import Dbf5 
import os 
import sys 

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

wyjściowa:

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

ja naprawdę nie wiem, jak rozwiązać ten problem.

Odpowiedz

4

Spróbuj użyć my dbf library:

import dbf 
with dbf.Table('test.dbf') as table: 
    dbf.export(table, 'junk.csv') 
2

pisałem simpledbf. Linia, która powoduje problemy, była wynikiem niektórych testów, które wykonywałem przy opracowywaniu modułu. Przede wszystkim możesz chcieć zaktualizować swoją instalację, ponieważ 0.2.6 jest najnowszą. Następnie możesz spróbować usunąć ten konkretny wiersz (# 557) z pliku "D: \ ProgramFiles \ Anaconda \ lib \ site-packages \ simpledbf \ simpledbf.py". Jeśli to nie zadziała, możesz zadzwonić do mnie pod numer GitHub repo for simpledbf lub wypróbować sugestię Ethana dla modułu dbf.

+0

To też działa. Dziękuję za odpowiedź. :) Wystąpił tylko błąd w pustym polu. "ValueError: Typ kolumny" "jeszcze nieobsługiwany." – Krivers

0

W razie potrzeby można dekodować i kodować. dbfpy zakłada, że ​​ciągi znaków są kodowane w postaci utf8, dzięki czemu można dekodować, ponieważ nie jest to kodowanie, a następnie kodować ponownie za pomocą odpowiedniego kodowania.

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"