Есть ли способ заменить и обрезать значения в отдельных полях, используя dbf для преобразования в csv библиотеки python dbf от ethanfurman?

#python #csv #dbf

Вопрос:

Я использую библиотеку python dbf Итана Фурмана для преобразования нескольких файлов dbf в csv. Для этого он работает очень хорошо. Я хотел бы дополнительно отредактировать некоторые поля в процессе преобразования, но не уверен, как это сделать. В частности, я хотел бы заменить строковые поля, которые содержат только 1 или более пробелов, пустыми строками (например, » » заменить на «») и поля даты, которые содержат «00000000», пустыми строками «». Я был бы очень признателен, если бы кто-нибудь мог описать, как редактировать поля и записывать обновленные записи в процессе преобразования. Очевидно, я мог бы написать простой дополнительный скрипт для редактирования выходных файлов csv во время преобразования, но я хотел бы сделать все это за один шаг, если это возможно. Вот код, который я использую для преобразования файлов:

 import csv
import dbf
import os
import sys

folder=sys.argv[1]

for dirpath, dirnames, filenames in os.walk(folder):
    for filename in filenames:
        if filename.endswith('.DBF'):
            db=dbf.Table(filename, ignore_memos=True)
            db.open()
            csv_fn = filename[:-4]  ".csv"
            dbf.export(db, filename=csv_fn, format='csv', header=True)
 

Ответ №1:

По умолчанию при использовании таблицы dbf возвращаемые типы данных являются простыми, int т. Е. , str , bool , и т.д. datetime.datetime Но вы можете создавать свои собственные типы данных и использовать их вместо них, указав их в default_data_types параметре:

 db = dbf.Table(
        filename,
        ignore_memos=True,
        default_data_types={
            'C': my_white_space_stripping_data_type,
            'D': my_empty_date_str_data_type,
            },
        )
 

К счастью, dbf уже поставляется с четырьмя расширенными типами данных:

  • Char — автоматически удаляет конечные пробелы и игнорирует конечные пробелы для сравнения
  • Logical — поддерживает True , False , и None ( None возвращается, когда значение поля не равно true или false — я видел ? , ' ' , и другой странный мусор)
  • Date — поддерживает пустую дату, например 00000000 , и отображает их как ''
  • DateTime — поддерживает пустую дату / время и отображает их как ''

Как правило, если вы используете один из расширенных типов данных, вы, вероятно, хотите их все, поэтому вместо словаря вы можете просто передать строку:

 db = dbf.Table(
        filename,
        ignore_memos=True,
        default_data_types='enhanced',
        )
 

Теперь, когда файл csv экспортируется, завершающий пробел удаляется, а поля даты становятся пустыми '' .

Имейте в виду, что пустые логические поля станут '?' вместо '' , поэтому вам может понадобиться более длинная форма указания dict to default_data_types и только переопределение C and D .

Комментарии:

1. Я уверен, что это что-то незначительное, но теперь я получаю следующую ошибку после добавления сегмента «default_data_types»: File "/data/clients/hcp-nv/load/raw/scripts/convert_dbf_to_csv_using_dbf_all_matching_files.py", line 11, in <module> db=dbf.Table(filename, ignore_memos=True, default_data_types='enhanced_data_types') File "/usr/local/lib/python3.7/site-packages/dbf/__init__.py", line 5529, in __init__ for field, types in default_data_types.items(): AttributeError: 'str' object has no attribute 'items' . предложения / рекомендации?

2. @always_learning: Извините, было еще рано — строка должна быть «улучшена». Ответ исправлен.