2015-07-07 12 views
6

Ich habe dbf Datenbank in cp1250 codiert und ich lese diese Datenbank Folowing Code verwendet:DBF - kodiert 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 ist, dass die endgültige CSV-Datei falsch ist. Die Codierung der Datei ist ANSI und einige Zeichen sind beschädigt. Ich möchte Sie fragen, ob Sie mir helfen können, dbf-Datei korrekt zu lesen.

EDIT 1

Ich habe versucht, verschiedene Code aus https://pypi.python.org/pypi/simpledbf/0.2.4, gibt es einige Fehler.

Quelle 2:

from simpledbf import Dbf5 
import os 
import sys 

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

Ausgang:

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

Ich weiß nicht wirklich, wie dieses Problem zu lösen.

Antwort

4

Try my dbf library mit:

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

Ich schrieb simpledbf. Die Linie, die Sie Probleme verursacht, war von einigen Tests, die ich tat, als ich das Modul entwickelte. Zuallererst möchten Sie vielleicht Ihre Installation aktualisieren, da 0.2.6 die aktuellste Version ist. Dann können Sie versuchen, diese bestimmte Zeile (# 557) aus der Datei "D: \ Programme \ Anaconda \ lib \ site-packages \ simpledbf \ simpledbf.py" zu entfernen. Wenn das nicht funktioniert, können Sie mich unter GitHub repo for simpledbf anpingen, oder Sie könnten Ethans Vorschlag für das DBF-Modul ausprobieren.

+0

Es funktioniert auch. Danke für die Antwort. :) Es gibt nur einen Fehler in einem leeren Feld. "ValueError: Spaltentyp" "noch nicht unterstützt." – Krivers

0

Sie können nach Bedarf dekodieren und codieren. dbfpy geht davon aus, dass Strings utf8 codiert sind, so dass Sie entschlüsseln können, da es nicht diese Codierung ist und dann erneut mit der richtigen Codierung codieren.

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"