2015-07-07 4 views
6

У меня есть база данных 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.

EDIT 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

Я действительно не знаю, как решить эту проблему.

ответ

4

Попробуйте использовать my dbf library:

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

Я написал simpledbf. Линия, которая вызывает у вас проблемы, связана с некоторыми тестами, которые я делал при разработке модуля. Прежде всего, вам может потребоваться обновить вашу установку, так как самая последняя из них - 0.2.6. Затем вы можете попробовать удалить эту конкретную строку (# 557) из файла «D: \ ProgramFiles \ Anaconda \ lib \ site-packages \ simpledbf \ simpledbf.py». Если это не сработает, вы можете запросить меня на GitHub repo for simpledbf, или вы можете попробовать предложение Итана для модуля dbf.

+0

Он также работает. Спасибо за ответ. :) В пустом поле есть ошибка. «ValueError: Тип столбца» «пока не поддерживается». – Krivers

0

Вы можете декодировать и кодировать при необходимости. 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"