#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: Извините, было еще рано — строка должна быть «улучшена». Ответ исправлен.