我有~300个文件夹,我想将.dbf文件转换为.csv文件。
我正在使用os.walk
查找所有.dbf文件,然后使用dbfpy
模块将每个.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()
答案 0 :(得分: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'语句(上下文管理器)将关闭文件并在最后刷新缓冲区,而无需您明确地执行此操作。