преобразовать файл csv в dbf

У меня много файлов csv, и я хотел бы преобразовать их в файл dbf. Я нашел код от Итана Фурмана (см. ниже). Он работает очень хорошо, большое спасибо, но в моих CSV-файлах в качестве разделителя используется точка с запятой. Итак, с кодом Python помещает все мои данные в один столбец, но у меня есть 5 столбцов. Как я могу изменить разделитель?

вот ссылка: Преобразовать файл .csv в .dbf с помощью Python?

особенно:

Используя пакет dbf, вы можете получить базовый файл csv с кодом, подобным этому:

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

Это создаст таблицу с тем же именем и полями Character или Memo и именами полей f0, f1, f2 и т. д.

Для другого имени файла используйте параметр filename, и если вы знаете имена своих полей, вы также можете использовать параметр field_names.

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

Достаточно базовая документация доступна здесь.


person Julia    schedule 23.01.2012    source источник
comment
Я не уверен, какой код вы имеете в виду. Кажется, вам не хватает нескольких ссылок. Я проверил код на code.activestate.com/recipes/362715- dbf-reader-and-write, и кажется, что он конвертирует из одного формата dbf (Xbase) в другой (двоичный), а не из CSV в dbf. Это правильный код?   -  person jpaugh    schedule 23.01.2012


Ответы (1)


Глядя на код dbf, я не вижу способа передать диалект, поэтому вы можете преобразовать свои файлы следующим образом:

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:
person jcollado    schedule 23.01.2012
comment
Возможно, добавьте «импорт csv», чтобы завершить его. - person Johan Lundberg; 23.01.2012
comment
@JohanLundberg Я добавил отсутствующий импорт. Спасибо за ваш отзыв. - person jcollado; 23.01.2012