【问题标题】:Batch conversion of .dbf to .csv in Python在 Python 中将 .dbf 批量转换为 .csv
【发布时间】: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()

【问题讨论】:

    标签: python csv for-loop os.walk


    【解决方案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 循环中放入一个虚拟打印语句,它不会输出任何内容。
    猜你喜欢
    • 2012-02-09
    • 2011-04-23
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2011-05-25
    • 2012-12-06
    • 2012-02-16
    相关资源
    最近更新 更多