我需要将带有数值的 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, ...
基于对 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 ')])