Преобразование файла DBF в CSV с использованием Python 3+ с ошибками - PullRequest
1 голос
/ 05 января 2020

Итак, я новичок в Python, и моя цель - конвертировать разные большие dbf-файлы в csv-файлы. Я посмотрел на другой код и не понимаю многих частей. Приведенный ниже код работает для data1.dbf, но не для data2.dbf. Я получаю сообщение об ошибке:

UnicodeDecodeError: код "ascii" c не может декодировать байт ...

Я изучил кодировку для dbfread, но он говорит, что кодирование не нужно ... Другая часть, в которой я нуждаюсь, состоит в том, чтобы получить эти большие dbfs в csv. Если я использую dbfread, я не разбираюсь в коде, чтобы поместить его в файл csv.

import sys
import csv
from dbfread import DBF

file = "C:/Users/.../Documents/.../data2.dbf"
table = DBF(file)
writer = csv.writer(sys.stdout)
writer.writerow(table.field_names)
for record in table:
    writer.writerow(list(record.values()))

Вот еще одна попытка использования библиотеки dbf.

import dbf  # instead of dbfpy
for table in sys.argv[1:]:
    dbf.export(table, header = True)

Эта команда запускается из команды, предложенной с оператором "python dbf2csv_EF.py data1.dbf ", при попытке выполнить оба моих файла dbf выдает другую ошибку. Ошибка:

... AttributeError: у объекта 'str' нет атрибута '_meta'

1 Ответ

1 голос
/ 05 января 2020

Поскольку вы используете Windows и пытаетесь записать в sys.stdout, я думаю (частично), что ваша первая проблема заключается в том, что консоль Windows не очень подкована в Unicode, и вам следует вместо этого записывать в файлы .

Если предположить, что это так, то что-то вроде

import sys
import csv
from dbfread import DBF

for file in sys.argv[1:]:
    csv_file = file + ".csv"
    table = DBF(file, encoding="UTF-8")
    with open(csv_file, "w") as outf:
        writer = csv.writer(outf)
        writer.writerow(table.field_names)
        for record in table:
            writer.writerow(list(record.values()))

может сработать - при запуске скрипта, например, "python thatscript.py foo.dbf", вы должны получить "foo.dbf.csv".

...