Перенос данных из таблицы Excel (openpyxl) в таблицу базы данных (dbf) - PullRequest
0 голосов
/ 02 января 2019

У меня есть простая проблема чтения листа Excel, обрабатывать каждую строку, содержащую около 83 столбцов, как уникальную запись базы данных, добавлять ее в локальную базовую запись и в конечном итоге добавлять и записывать в файл DBF.

Я могу извлечьВсе значения из Excel и добавить их в список.Но список не правильный синтаксис, и я не знаю, как подготовить / преобразовать список в запись базы данных.Я использую Openpyxl, dbf и python 3.7.

На данный момент я только тестирую и пытаюсь подготовить данные для строки 3 (отсюда min_maxх строк = 3)

Я понимаю, что данныедолжно быть в формате (('', '', '', ... 83 записи), \ ('', '', '', ... 83 записи) \)

Но яне знаете, как преобразовать данные списка в запись или, наоборот, как читать данные в формате Excel непосредственно в добавляемом формате DF

tbl_tst.open(mode=dbf.READ_WRITE) # all fields character string

for everyrow in ws_IntMstDBF.iter_rows(min_row = 3, max_row = 3, max_col = ws_IntMstDBF.max_column-1):
    datum = [] #set([83]), will defining datum as () help solve the problem?
    for idx, cells in enumerate(everyrow):
        if cells.value is None: # for None entries, enter empty string
            datum.append("")
            continue
        datum.append(cells.value) # else enter cell values 

     tbl_tst.append(datum) # append that record to table !!! list is not record error here

tbl_tst.close()

Ошибка жалуется на использование списка для добавления в таблицу, и этодолжна быть запись и т. д. Пожалуйста, укажите, как я могу преобразовать строки Excel в добавляемые данные таблицы DBF.

raise TypeError("data to append must be a tuple, dict, record, or template; not a %r" % type(data))
TypeError: data to append must be a tuple, dict, record, or template; not a <class 'list'>

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Измените

tbl_tst.append(datum)

на

tbl_tst.append(tuple(datum))

, и это избавит от этой ошибки.Пока все данные вашей ячейки имеют соответствующий тип, добавление должно работать.

0 голосов
/ 03 января 2019

Спасибо за ответы, я немного коснулся прошлой ночи, пытаясь найти разные решения.

Одно из решений, которое сработало для меня, заключается в следующем: я убедился, что все данные рабочего листа, которые я использую, - это все строки / текст, и преобразовал все пустые записи в тип String и ввел пустую строку.Таким образом, следующий код выполняет эту задачу:

#house keeping
for eachrow in ws_IntMstDBF.iter_rows(min_row=2, max_row=ws_IntMstDBF.max_row, max_col=ws_IntMstDBF.max_column):
    for idx, cells in enumerate(eachrow):
        if cells.value is None: # change every Null cell type to String and put 0x20 (space)
            cells.data_type = 's'
            cells.value = " "

После написания рабочего листа я снова открыл его, используя panda dataframe, и проверил, все ли содержимое имеет строковый тип, и что в dataframe не осталось значений «nan».Затем я использовал функцию df2dbf из «Dani Arribas-Bel», изменил ее в соответствии с данными, с которыми я работаю, и преобразовал в dbf.

Код, который импортирует фрейм данных и преобразует его в формат dbf, выглядит следующим образом:

abspath = Path(__file__).resolve() # resolve to relative path to absolute
rootpath = abspath.parents[3] # root (my source file is3 sub directories deep
xlspath = rootpath / 'sub-dir1' / 'sub-dir2' / 'sub-dir3' / 'test.xlsx'
# above code is only resolving file location, ignore 
pd_Mst_df = pd.read_excel(xlspath)
#print(pd_Mst_df) # for debug 
print("... Writing Master DBF file ")
df2dbf(pd_Mst_df, dbfpath) # dbf path is defined similar to pd_Mst path

Функция df2dbg использует pysal для записи кадра данных в формате dbf: я внес некоторые изменения в код для определения длины строки длины и типов символов следующим образом:

import pandas as pd
import pysal as ps
import numpy as np

# code from function df2dbf
else:
    type2spec = {int: ('N', 20, 0),
                 np.int64: ('N', 20, 0),
                 float: ('N', 36, 15),
                 np.float64: ('N', 36, 15),
                 str: ('C', 200, 0)
                 }
    #types = [type(df[i].iloc[0]) for i in df.columns]
    types = [type('C') for i in range(0, len(df.columns))] #84)] #df.columns)] #range(0,84)] # i not required, to be removed
    specs = [type2spec[t] for t in types]
db = ps.open(dbf_path, 'w')
# code continues from function df2dbf

Pandas dataframe didnне требует дальнейших изменений, так как все исходные данные были правильно отформатированы перед передачей в файл Excel.

Я предоставлю ссылку на pysal и df2dbf, как только найду ее в stackoverflow.

0 голосов
/ 02 января 2019

Проверьте библиотеку Python Pandas ...

Чтобы прочитать данные из Excel intaframe Pandas, вы можете использовать pandas.read_excel

После считывания даты в фрейм данных Pandas вы можете манипулировать ею и затем записывать ее в базу данных, используя pandas.DataFrame.to_sql

См. Также это объяснение для работы с базой данных io

...