使用Ethan Furman的Python dbf库转csv时如何替换修剪单字段值?
解决方法
你可以在读取DBF记录的同时完成字段清洗,直接写入CSV文件,单步完成所有转换操作,无需二次处理输出的CSV。修改后的代码如下:
import csv import dbf import os import sys folder = sys.argv[1] for dirpath, dirnames, filenames in os.walk(folder): for filename in filenames: if filename.upper().endswith('.DBF'): # 拼接完整路径,支持子目录文件读写 dbf_path = os.path.join(dirpath, filename) # 使用with上下文管理器自动关闭表 with dbf.Table(dbf_path, ignore_memos=True) as db: db.open() csv_path = os.path.join(dirpath, f"{filename[:-4]}.csv") # 打开CSV文件写入 with open(csv_path, 'w', encoding='utf-8', newline='') as csv_f: writer = csv.writer(csv_f) # 写入表头 writer.writerow(db.field_names) # 逐行处理记录 for record in db: processed_record = [] for field, value in zip(db.fields, record): # 处理字符型字段:全空格替换为空 if field.type == 'C': if isinstance(value, str) and value.strip() == '': processed_record.append('') else: processed_record.append(value if value is not None else '') # 处理日期型字段:00000000替换为空 elif field.type == 'D': if str(value) == '00000000': processed_record.append('') else: processed_record.append(value if value is not None else '') # 其他类型字段直接保留 else: processed_record.append(value if value is not None else '') writer.writerow(processed_record)
代码调整说明
- 补充了路径拼接逻辑,支持遍历子文件夹内的所有DBF文件,避免原代码找不到文件的问题
- 新增了字段清洗逻辑,完全匹配你提出的两条处理规则
- 增加了空值兼容处理,避免特殊字段值导致的写入异常
- 使用
with上下文管理器自动管理文件/表的开闭,资源释放更安全
内容的提问来源于stack exchange,提问作者always_learning
相关产品推荐
相关产品推荐

