2015-07-07 30 views
6

Tôi có cơ sở dữ liệu dbf mã hóa trong cp1250 và tôi đọc cơ sở dữ liệu này sử dụng mã folowing:DBF - mã hóa 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" 

Vấn đề là, rằng tập tin csv thức là sai. Mã hóa tệp là ANSI và một số ký tự bị hỏng. Tôi muốn hỏi bạn, nếu bạn có thể giúp tôi làm thế nào để đọc tập tin dbf một cách chính xác.

EDIT 1

Tôi đã thử mã khác nhau từ https://pypi.python.org/pypi/simpledbf/0.2.4, có một số lỗi.

Nguồn 2:

from simpledbf import Dbf5 
import os 
import sys 

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

Output:

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

tôi thực sự không biết làm thế nào để giải quyết vấn đề này.

Trả lời

4

Hãy thử sử dụng my dbf library:

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

tôi đã viết simpledbf. Dòng gây ra cho bạn vấn đề là từ một số thử nghiệm tôi đã làm khi phát triển mô-đun. Trước hết, bạn có thể muốn cập nhật cài đặt của mình, vì phiên bản 0.2.6 là mới nhất. Sau đó, bạn có thể thử loại bỏ dòng cụ thể đó (# 557) khỏi tệp "D: \ ProgramFiles \ Anaconda \ lib \ site-packages \ simpledbf \ simpledbf.py". Nếu điều đó không hiệu quả, bạn có thể ping cho tôi theo số GitHub repo for simpledbf hoặc bạn có thể thử đề xuất của Ethan cho mô-đun dbf.

+0

Nó cũng hoạt động. Cảm ơn về câu trả lời. :) Chỉ có lỗi trên trường trống. "ValueError: Loại cột" "chưa được hỗ trợ." – Krivers

0

Bạn có thể giải mã và mã hóa khi cần thiết. dbfpy giả sử chuỗi được mã hóa utf8, vì vậy bạn có thể giải mã vì mã hóa không phải là mã hóa và sau đó mã hóa lại bằng mã hóa đúng.

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"