Python 读取 Excel 表格并导出为 DBF 文件

以下是将上述代码封装为函数的版本。函数接收 input_excel_pathsheet_nameoutput_dbf_path 作为参数,按照需求读取 Excel 表格并导出为 DBF 文件。

封装函数代码

python 复制代码
import pandas as pd
import dbf

def excel_to_dbf(input_excel_path, sheet_name, output_dbf_path):
    """
    将 Excel 的指定工作表导出为 DBF 文件,保留数据类型和列名格式。

    参数:
        input_excel_path (str): 输入的 Excel 文件路径。
        sheet_name (str): 需要读取的工作表名称。
        output_dbf_path (str): 导出的 DBF 文件路径。
    """
    # 读取 Excel 的指定表
    df = pd.read_excel(input_excel_path, sheet_name=sheet_name)

    # 定义字段字符串列表,根据数据类型进行动态判断
    def get_field_definition(column):
        if df[column].dtype == 'object':  # 字符类型
            return f"{column} C(255)"
        elif pd.api.types.is_integer_dtype(df[column]):  # 整型
            return f"{column} N(10,0)"  # 整型无需小数位,最大宽度10
        elif pd.api.types.is_float_dtype(df[column]):  # 浮点型
            # 判断小数位数
            max_decimal_places = df[column].apply(
                lambda x: len(str(x).split(".")[1]) if pd.notnull(x) and "." in str(x) else 0
            ).max()
            return f"{column} N(18,{min(max_decimal_places, 5)})"  # 浮点型设置小数位,限制最大5位
        elif pd.api.types.is_datetime64_any_dtype(df[column]):  # 日期类型
            return f"{column} D"
        else:
            raise ValueError(f"Unsupported column type for {column}")

    # 生成字段定义,确保列名格式不变
    field_definitions = ";".join([get_field_definition(col) for col in df.columns])

    # 使用指定编码创建 DBF 表
    table = dbf.Table(output_dbf_path, field_definitions, codepage="utf8")
    table.open(dbf.READ_WRITE)

    # 写入数据
    for _, row in df.iterrows():
        row_data = tuple(row.fillna("").to_list())  # 用空值填充 NaN
        table.append(row_data)

    table.close()
    print(f"The table {sheet_name} exported to {output_dbf_path}.")

# 使用示例
if __name__ == "__main__":
    input_excel_path = r"E:\_OrderingProject\F_IslandsBoundaryChange\c_GeeData\Tif_Thumbnail_check\_check.xlsx"
    sheet_name = "fix_v1"
    output_dbf_path = r"E:\_OrderingProject\F_IslandsBoundaryChange\c_GeeData\Tif_Thumbnail_check\fix_v1.dbf"
    
    excel_to_dbf(input_excel_path, sheet_name, output_dbf_path)

函数说明

  1. 函数参数:

    • input_excel_path:输入的 Excel 文件路径。
    • sheet_name:Excel 文件中需要导出的工作表名称。
    • output_dbf_path:目标 DBF 文件的输出路径。
  2. 动态字段定义:

    • 根据列数据类型(字符、整型、浮点型、日期等)生成适当的 DBF 字段定义。
    • 确保小数位数动态调整(浮点型最多保留 5 位小数)。
  3. 自动填充缺失值:

    • 用空字符串填充 NaN 值,确保写入 DBF 时不会出错。
  4. 编码:

    • 使用 utf8 编码创建 DBF 表,保证支持中文字符。
  5. 异常处理:

    • 如果遇到不支持的数据类型,会引发 ValueError,提示用户检查输入数据。

示例输出

假设输入的 fix_v1 工作表数据如下:

ID Name Score Date
1 Alice 95.0 2024-12-09
2 Bob 89 2024-12-08
3 Carol 82.5 2024-12-07

导出的 fix_v1.dbf 文件会保留字段类型和格式一致。

如果这对您有所帮助,希望点赞支持一下作者! 😊

详细全文-点击查看

相关推荐
许彰午3 小时前
14_Java泛型完全指南
java·windows·python
广州灵眸科技有限公司3 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) Easy-Eai编译环境准备与更新
服务器·前端·人工智能·python·深度学习
TechWayfarer4 小时前
IP风险等级评估接入实战:金融信贷如何用IP画像辅助风控审核
python·tcp/ip·安全·金融
Esaka_Forever4 小时前
uv init 完整用法(Python 最快包管理器)
服务器·python·uv
代码中介商6 小时前
C++左值与右值:核心判断法则详解
开发语言·c++
JAVA9656 小时前
JAVA面试-并发篇 05-并发包AQS队列实现原理是什么
java·开发语言·面试
Halo_tjn6 小时前
反射与设计模式1
java·开发语言·算法
神仙别闹7 小时前
基于Python + SQL server 实现(GUI)原神圣遗物管理与角色数值模拟系统
java·数据库·python
珊瑚里的鱼7 小时前
手撕单例模式中的饿汉模式和懒汉模式,懒汉模式还要再多加一个C++11版本的
开发语言·c++·单例模式
是有头发的程序猿7 小时前
电商自动化实战:淘宝/天猫item_get商品详情API全量采集教程(Python源码)
java·python·自动化