将csv文件转换为dbf

6 投票
1 回答
4155 浏览
提问于 2025-04-17 10:53

我有很多CSV文件,想把它们转换成DBF文件。我找到了Ethan Furman写的代码(见下文),这个代码运行得很好,非常感谢。但是我的CSV文件使用分号作为分隔符,所以用这个代码后,Python把我所有的数据都放到了一列里,而我其实有5列数据。我该怎么改变分隔符呢?

这里是链接: 用Python将.csv文件转换为.dbf文件?

特别是:

使用dbf这个包,你可以用类似下面的代码来处理一个基本的CSV文件:

import dbf
some_table = dbf.from_csv(csvfile='/path/to/file.csv', to_disk=True)

这段代码会创建一个与CSV文件同名的表,字段类型可以是字符型或备忘录型,字段名会是f0、f1、f2等等。

如果你想用不同的文件名,可以使用filename这个参数,如果你知道字段名的话,也可以使用field_names这个参数。

some_table = dbf.from_csv(csvfile='data.csv', filename='mytable',
        field_names='name age birth'.split())

这里有一些比较基础的文档可以参考 这里

1 个回答

5

看了看 dbf 的代码,我没有看到有什么方法可以传递方言(dialect),所以你可以按照以下方式转换你的文件:

import csv
reader = csv.reader(open('input.csv'), delimiter=';')
writer = csv.writer(open('output.csv', 'w'))
for row in reader:
    writer.writerow(row)

注意:这样做会正确处理那些已经包含逗号的行。

补充:如果你愿意修改 dbf.from_csv 这个函数,让它接受 delimiter 作为参数,这样就可以避免转换所有的 csv 文件,这样做应该是可行的:

--- dbf.py.orig 2012-01-23 12:48:32.112101218 +0100
+++ dbf.py  2012-01-23 12:49:59.468534408 +0100
@@ -4502,13 +4502,14 @@
         print str(table[0])
     finally:
         table.close()
-def from_csv(csvfile, to_disk=False, filename=None, field_names=None, extra_fields=None, dbf_type='db3', memo_size=64, min_field_size=1):
+def from_csv(csvfile, to_disk=False, filename=None, field_names=None, extra_fields=None, dbf_type='db3', memo_size=64, min_field_size=1,
+             delimiter=','):
     """creates a Character table from a csv file
     to_disk will create a table with the same name
     filename will be used if provided
     field_names default to f0, f1, f2, etc, unless specified (list)
     extra_fields can be used to add additional fields -- should be normal field specifiers (list)"""
-    reader = csv.reader(open(csvfile))
+    reader = csv.reader(open(csvfile), delimiter=delimiter)
     if field_names:
         field_names = ['%s M' % fn for fn in field_names]
     else:

撰写回答