Python 将.CSV转换为.DBF(dBASEIII)VFP 6.0,所有内容都变成memo字段
我正在尝试使用python将excel文件转换为dbf(dBASEIII),我当前的过程是: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') 到目前为止,当流程结束时,所有字段都成为备注字段
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答案。