在 Python 中将 .dbf 批量转换为 .csv

Posted

技术标签:

【中文标题】在 Python 中将 .dbf 批量转换为 .csv【英文标题】:Batch conversion of .dbf to .csv in Python 【发布时间】:2013-08-28 11:05:21 【问题描述】:

我有大约 300 个包含 .dbf 文件的文件夹,我想将它们转换为 .csv 文件。

我使用os.walk 查找所有.dbf 文件,然后使用dbfpy 模块的for 循环将每个.dbf 文件转换为.csv。它似乎正在正确查找和读取 .dbf 文件,但没有将它们转换为 .csv。我相信 csv.writer 代码是问题所在。我没有收到任何错误,但文件仍为 .dbf。

我下面的代码基于找到的代码here。

import csv
from dbfpy import dbf
import os

path = r"\Documents\House\DBF"


for dirpath, dirnames, filenames in os.walk(path):
    for filename in filenames:
        if filename.endswith('.DBF'):
            in_db = dbf.Dbf(os.path.join(dirpath, filename))
            csv_fn = filename[:-4]+ ".csv"
            out_csv = csv.writer(open(csv_fn,'wb'))

        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()

【问题讨论】:

【参考方案1】:

您拥有的原始文件将保留为 dbf。您实际上并没有替换它,而是创建了一个新的 csv 文件。我认为问题在于写入磁盘永远不会发生。我怀疑 csv 写入器没有刷新文件缓冲区。

我看到的另一个问题是 out_csv 是有条件地创建的,所以如果您在该目录中有其他文件具有不同的扩展名,您会遇到问题。

尝试使用上下文管理器:

for dirpath, dirnames, filenames in os.walk(path):
    for filename in filenames:
        if filename.endswith('.DBF'):
            csv_fn = filename[:-4]+ ".csv"
            with open(csv_fn,'wb') as csvfile:
                in_db = dbf.Dbf(os.path.join(dirpath, 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()

'with' 语句(上下文管理器)将关闭文件并在最后刷新缓冲区,您无需显式执行此操作。

【讨论】:

感谢您的回复...不幸的是,我仍然无法使其正常工作。我在 in_db 之前收到第二个“as”的“无效语法”错误。我尝试了一堆不同的东西,但没有运气......呃。任何建议都会非常受欢迎! 对不起,这是我的粗心大意。我没有运行这个,并犯了几个错字。道德 - 总是测试你的代码,尤其是当你确定它工作时:) 试试上面编辑过的代码,如果你仍然遇到问题,请告诉我。 接近我想。运行新版本后,出现以下错误:“struct.error: unpack requires a string argument of length 8” 我将“new = True”添加到“dbf.Dbf(os.path.join(dirpath, filename), new=True )" 来缓解这种情况。现在我收到一个属性错误:“AttributeError: _exit_”我做了一些搜索,看起来这与“with 语句”很常见,但不清楚如何修复。 with 需要您正在创建的对象的 enterexit 方法。查看 Dbf 类的源代码,它缺少这个。解决方案是将“with dbf”移动到 with open(csv) 块中。请参阅上面的修改。 嗯...消除了错误,但转换仍未发生(文件保留为 dbf)。我认为 for 循环中没有执行任何操作。如果我在 for 循环中放入一个虚拟打印语句,它不会输出任何内容。

以上是关于在 Python 中将 .dbf 批量转换为 .csv的主要内容,如果未能解决你的问题,请参考以下文章

将visual foxpro dbf表批量转换为csv

在 Inkscape 中将 SVG 批量转换为 PNG 不起作用

使用 Python 将 .csv 文件转换为 .dbf?

在 Pentaho 中将批量 .xlsx 文件转换为 .csv (UTF-8)

如何在 PyTorch 中将句子长度批量转换为掩码?

在mysql Sequelize + Nodejs中将数组和对象转换为批量插入