Python中.dbf到.csv的批转换

Python中.dbf到.csv的批转换,python,csv,for-loop,os.walk,Python,Csv,For Loop,Os.walk,我有大约300个文件夹,其中包含.dbf文件,我想将其转换为.csv文件 我正在使用os.walk查找所有.dbf文件,然后使用dbfpy模块的for循环将每个.dbf文件转换为.csv。它似乎在正确地查找和读取.dbf文件,但没有将其转换为.csv。我相信csv.writer代码就是问题所在。我没有收到任何错误,但文件保持为.dbf 我下面的代码基于找到的代码 您拥有的原始文件将保留为dbf。您实际上并没有替换它,而是创建一个新的csv文件。我认为问题在于磁盘写入从未发生过。我怀疑csv写入程

我有大约300个文件夹,其中包含.dbf文件,我想将其转换为.csv文件

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

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


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

感谢您的回复…不幸的是,我仍然无法让这项工作。在_db中,前面的第二个“as”出现了“无效语法”错误。我尝试了很多不同的方法,但是没有成功…啊。欢迎提出任何建议!对不起,那是我的疏忽。我没有运行这个程序,只是打了几个错。寓意——经常测试你的代码,尤其是当你确信它能工作的时候:)试试上面编辑的代码,如果你仍然有问题,告诉我。我想接近。在运行新版本后,我遇到了以下错误:“struct.error:unpack需要一个长度为8的字符串参数”我在“dbf.dbf(os.path.join(dirpath,filename),new=True)”中添加了“new=True”以缓解这种情况。现在我得到了一个属性错误:“AttributeError:_exit_u”我已经做了一些搜索,这似乎与“with语句”很常见,但不清楚如何修复。
with
需要为正在创建的对象使用一个输入和退出方法。查看Dbf类的源代码,它缺少这一点。解决方案是将“with dbf”移动到with open(csv)块中。请参阅我在上面的修改。Hmmm…它消除了错误,但转换仍然没有发生(文件保持为dbf)。我认为for循环中没有执行任何操作。如果我在for循环中放入一个伪print语句,它不会输出任何东西。
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()