将csv文件转换为dbf
我有很多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: