Я пишу программу для загрузки файла Excel в базу данных, но при использовании pandas для загрузки данных выдается ошибка, так как она читает дату в виде строки, хотя то же самое работает с openpyxl
Codeиспользование кода Pandas
try:
Conf=LoadConfig.loadConfig()
cursor, connection =Util.getConnection(Conf['SRC'])
data = data.applymap(lambda s: removeSpecialCharacters(s))
columNameList=[col for col in data.columns]
DataListInp=data.to_dict('records')
query='TRUNCATE TABLE '+name
cursor.execute(query)
query='insert into '+name+'('
columnstring=",".join(str(x) for x in columNameList)
paramString=",".join(':'+str(x) for x in columNameList)
finalquery=query+columnstring+') values( '+paramString+')'
cursor.prepare(finalquery)
cursor.executemany(None, DataListInp)
connection.commit()
except Exception as e:
print(e)
traceback.print_exc()
finally:
if cursor is not None:
cursor.close()
connection.close()
def loadExcel(filename,sheets):
sheetList=sheets.split(',')
sheets_dict = pd.read_excel(filename, sheet_name=sheetList,keep_default_na=False)
for name, data in sheets_dict.items():
print(name,'Sheet Loading Start')
loadSheets(data,name)
print(name,'Sheet Loading Finished')
Использование OpenPyxl:
try:
cursor, connection =Util.getConnection(Conf['SRC'])
SheetData=tuple(ws.values)
columNameList=list(SheetData[0])
DataListInp=list(SheetData[1:])
#DataList = [tuple(map(lambda i: str.replace(str(i),'\xa0',"") if isinstance(i, str) else i, tup)) for tup in DataListInp]
DataList = [tuple(map(lambda i: str.replace(str.replace(str.replace(str(i),'_x000D_'," "),'\xa0'," "),'\n'," ") if isinstance(i, str) else i, tup)) for tup in DataListInp]
paramDictionary=[dict(zip(columNameList,row)) for row in DataList]
query='insert into '+ws.title+'('
columnstring=",".join(str(x) for x in columNameList)
paramString=",".join(':'+str(x) for x in columNameList)
finalquery=query+columnstring+') values( '+paramString+')'
cursor.prepare(finalquery)
cursor.executemany(None, paramDictionary)
connection.commit()
except Exception as e:
print(e)
traceback.print_exc()
finally:
if cursor is not None:
cursor.close()
connection.close()
if __name__ == '__main__':
if len(sys.argv) != 3:
logging.debug("No of Parameter should be 2 . 1= file_name, 2= sheets")
exit()
i_runParams=sys.argv
file_name=i_runParams[1]
sheets=i_runParams[2]
print(file_name)
print(sheets)
wb=openpyxl.load_workbook(file_name,data_only=True)
sheetList=sheets.split(',')
print(sheetList)
for sheet in sheetList:
ws=wb[sheet]
print(ws.title,' Sheet Loading Start')
loadSheets(ws)
print(ws.title,'Sheet Loading Finished')
Проблема заключается в том, что pandas читает поле даты в Excel, как показано ниже: CREATE_DATE: 2019-04-04 00:00:00 ',' UPDATE_DATE ':' 2019-04-04 00:00:00 ',
, хотя OpenPyxl читает как
' CREATE_DATE ': datetime.datetime (2019, 4, 4, 0, 0), 'UPDATE_DATE': datetime.datetime (2019, 4, 4, 0, 0)
Как мы можем получить тот же результат от панд?не может изменить тип данных столбца, так как мы не знаем, какой столбец будет датой, он должен быть динамическим