4

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

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

我下面的代码基于此处找到的代码。

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

1 回答 1

4

您拥有的原始文件将保留为 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' 语句(上下文管理器)将关闭文件并在最后刷新缓冲区,您无需显式执行此操作。

于 2013-08-27T14:49:16.687 回答