2015-07-07 15 views
6

ho DBF database codificato in cp1250 e sto leggendo questo database utilizzando il codice folowing:DBF - codifica 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" 

Il problema è che il file csv finale è sbagliato. La codifica del file è ANSI e alcuni caratteri sono corrotti. Vorrei chiederti, se puoi aiutarmi a leggere correttamente il file dbf.

EDIT 1

Ho provato codice diverso da https://pypi.python.org/pypi/simpledbf/0.2.4, c'è qualche errore.

Fonte 2:

from simpledbf import Dbf5 
import os 
import sys 

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

uscita:

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

io davvero non so come risolvere questo problema.

risposta

4

Provare a utilizzare my dbf library:

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

ho scritto simpledbf. La linea che sta causando problemi è da alcuni test che stavo facendo durante lo sviluppo del modulo. Prima di tutto, potresti voler aggiornare la tua installazione, poiché 0.2.6 è la più recente. Quindi puoi provare a rimuovere quella particolare linea (# 557) dal file "D: \ ProgramFiles \ Anaconda \ lib \ site-packages \ simpledbf \ simpledbf.py". Se ciò non funziona, puoi inviarmi un messaggio ping allo GitHub repo for simpledbf oppure potresti provare il suggerimento di Ethan per il modulo dbf.

+0

Funziona anche. Grazie per la risposta. :) C'è solo un errore nel campo vuoto. "ValueError: tipo di colonna" "non ancora supportato." – Krivers

0

È possibile decodificare e codificare secondo necessità. dbfpy presuppone che le stringhe siano codificate utf8, quindi è possibile decodificare poiché non è codifica e quindi ricodificare con la codifica corretta.

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"