在 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
需要您正在创建的对象的 enter 和 exit 方法。查看 Dbf 类的源代码,它缺少这个。解决方案是将“with dbf”移动到 with open(csv) 块中。请参阅上面的修改。
嗯...消除了错误,但转换仍未发生(文件保留为 dbf)。我认为 for 循环中没有执行任何操作。如果我在 for 循环中放入一个虚拟打印语句,它不会输出任何内容。以上是关于在 Python 中将 .dbf 批量转换为 .csv的主要内容,如果未能解决你的问题,请参考以下文章
在 Inkscape 中将 SVG 批量转换为 PNG 不起作用