Python 将.CSV转换为.DBF(dBASEIII)VFP 6.0,所有内容都变成memo字段

Python 将.CSV转换为.DBF(dBASEIII)VFP 6.0,所有内容都变成memo字段,python,visual-foxpro,foxpro,dbf,dbase,Python,Visual Foxpro,Foxpro,Dbf,Dbase,我正在尝试使用python将excel文件转换为dbf(dBASEIII),我当前的过程是: 使用xlrd将excel文件转换为.csv文件 我从.csv中删除标题并使用 获取新生成的.csv并使用dbf模块()转换为dbf 我从csv文件中删除标题,并运行以下操作: table = dbf.from_csv(origfname, filename='test.dbf', field_names=headers, dbf_type='db3') 到目前为止,当流程结束时,所有字段都成为备注字段

我正在尝试使用python将excel文件转换为dbf(dBASEIII),我当前的过程是:

  • 使用xlrd将excel文件转换为.csv文件
  • 我从.csv中删除标题并使用
  • 获取新生成的.csv并使用dbf模块()转换为dbf
  • 我从csv文件中删除标题,并运行以下操作:

    table = dbf.from_csv(origfname, filename='test.dbf', field_names=headers, dbf_type='db3')
    

    到目前为止,当流程结束时,所有字段都成为备注字段,如何将它们转换为字符、日期、数字等。。。字段?

    来自csv的
    方法仅用于转储到备注字段中

    如果您想获得更多控制权,则应跳过
    csv
    步骤,使用
    xlrd
    dbf
    xls
    转到
    dbf

    这将需要更多的工作:您必须首先使用适当的字段创建表,但接下来只需迭代xls表并写入dbf表

    比如说:

    some_table = Dbf.Table(
            'whatever.dbf',
            'name C(25); age N(3); history M',
            codepage='cp1252',
            )
    
    # get data from xlrd (specifics are not correct, psuedo-code only)
    ...
    data = []
    for row in sheet:
        for cell in row:
            data.append(cell.value)
        # back to real code
        some_table.append(tuple(data))
     # all data has been transferred
     some_table.close()
    

    要自动生成字段名和列类型,您需要循环浏览电子表格的前几行,以获取标题名和值类型。下面是我迭代的一个示例数据行:

    <type 'unicode'> u'PROD'
    <type 'unicode'> u'cclark'
    <type 'float'> 4.0
    <type 'float'> 99.0
    <type 'unicode'> u'501302'
    <type 'unicode'> u'244026'
    <type 'int'> 1
    <type 'float'> 42444.0
    <type 'str'> ''
    <type 'unicode'> u'AB'
    
    u'PROD'
    云雀
    4
    99
    u'501302'
    u'244026'
    1.
    42444
    ''
    u'AB'
    
    我想下面的问题是,当我使用Excel 2003进行转换时,我不必定义列的宽度。您知道Excel用于确定适当宽度以将其设置为的约定吗?@JonNgo:Excel中的
    宽度
    是可视的,而不是对存储数据的限制。如果您关心的是正确存储
    float
    字段,那么您可能希望使用
    vfp
    类型(默认为版本
    3
    ),这将允许您指定
    B
    (双精度浮点)类型。创建表时使用
    dbf\u type='vfp'
    。我对你的意思有点困惑,抱歉,我不是FoxPro专家。因此,我将再次尝试解释我的意思。当我在Excel中将.xls保存到.dbf(dbaseii)并在FoxPro中打开后续的dbf时,当我修改stru时,将为每列指定一种类型(Num、Char、Date等)和任意宽度。我想我的意思是,我希望我的python程序与Excel2003将.xls转换为.dbf(dBaseIII)的方式几乎相同@JonNgo:啊,我误解了你的问题。我不知道Excel使用的是什么过程,但通过检查
    xlrd
    (应该是
    date
    float
    ,等等)返回的值的类型,您应该可以大致做到这一点。我稍后会尝试在我的答案中添加更全面的内容。@JonNgo:Updated答案。