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

kuhbmx9i  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(233)

我需要转换成csv文件的字符串数字值的DBF文件
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结果:

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

我如何改进func以获得这样的结果?:

NUMBER, ...
584413, ...
079711, ...
478293, ...
000865, ...
3df52oht

3df52oht1#

基于对DBF表中数据格式的猜测。使用FieldParser从这里自定义字段类型更改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       ')])

相关问题