将类似 DBF 数字的列转换为字符串 CSV

问题描述 投票:0回答:1

我需要将带有数值的 DBF 文件转换为字符串形式的 csv 文件

DBF 文件列包含数字数据:

NUMBER,C,12 | ...
584413
079711
478293
000865

我使用这个 python 函数将其转换为 csv:

from dbfread import DBF
def dbf_to_csv(dbf_table_pth):#Input a dbf, output a csv, same name, same path, except extension
    csv_fn = dbf_table_pth[:-4]+ ".csv" #Set the csv file name
    table = DBF(dbf_table_pth)# table variable is a DBF object
    with open(csv_fn, 'w', encoding='utf-8', newline = '') as f:# create a csv file, fill it with dbf content
        writer = csv.writer(f, dialect='excel')
        writer.writerow(table.field_names)# write the column name
        for record in table:# write the rows
            writer.writerow(list(record.values()))
    return csv_fn# return the csv name

当我在记事本中打开它时,它会导致下面的 csv-result:

NUMBER, ...
"584413,0", ...
"79711,0", ...
"478293,0", ...
"865,0", ...

我怎样才能改进函数以获得这样的结果?:

NUMBER, ...
584413, ...
079711, ...
478293, ...
000865, ...
python csv type-conversion dbf
1个回答
0
投票

基于对 DBF 表中数据格式的猜测。 从这里使用

FieldParser
Custom Field Types来更改
NUMBER
字段的输出。使用
locale
设置为将
,
识别为十进制标记的语言环境,然后使用
locale.atof
转换为浮点数和
int()
转换为整数。

import locale
from dbfread import DBF, FieldParser

locale.setlocale( locale.LC_ALL, 'de_DE.UTF-8' )

tbl_db = DBF('test.dbf')

for row in tbl_db:
    print(row)

OrderedDict([('NUMBER', '3298,0'), ('NAME', 'test')])
OrderedDict([('NUMBER', '6214'), ('NAME', 'dog')])
OrderedDict([('NUMBER', '9418,0'), ('NAME', 'cat')])

class NumericConvert(FieldParser):
    def parseC(self, field, data):
        if field.name == "NUMBER":
            return int(locale.atof(data.decode()))
        else:
            return data

tbl_db = DBF('test.dbf', parserclass=NumericConvert)

for row in tbl_db:
    print(row)

OrderedDict([('NUMBER', 3298), ('NAME', b'test      ')])
OrderedDict([('NUMBER', 6214), ('NAME', b'dog       ')])
OrderedDict([('NUMBER', 9418), ('NAME', b'cat       ')])



© www.soinside.com 2019 - 2024. All rights reserved.