У меня есть несколько файлов данных Excel, которые я хочу импортировать в базу данных MySQL. Я создал скрипт для этого с пандами (read_excel), и поскольку у меня есть акценты и другие специальные символы, я должен кодировать данные, считанные пандами, в utf8 с помощью .str.encode () (и моя база данных MySQL - utf8),Проблема в том, что когда я импортирую данные в БД с помощью to_sql (), pandas преобразует все нулевые значения (NaN, NaT, Null, ...) в строку ...
Я пробовал много кодировок. Я попытался заменить нулевые значения на fillna (), а также заменить их на None, я также установил mysql, чтобы избежать недопустимых значений (STRICT_TRANS MODE и NO_ZERO_DATE для NaT)
for y in range(0,len(FICHIERS)):
DONNEES[FICHIERS[y].split('.')[0]] = pd.read_excel(os.path.join(APPLICATION_PATH,CONFIG.get('Excel','Chemin_Excel')+ FICHIERS[y] ), index_col=None)
def convertUTF(dataset):
for col in dataset:
dataset[col] = dataset[col].astype(str).str.encode(encoding='UTF-8',errors='replace')
return dataset
#converting all data to utf8
for nom, valeur in DONNEES.items():
DONNEES[nom] = convertUTF(valeur)
#insert into the db
engine = create_engine(INFOS_CONNECTION, encoding="utf-8", echo=True)
con = engine.connect()
con.execute("SET GLOBAL SQL_MODE='NO_ZERO_DATE';")
con.execute('SET FOREIGN_KEY_CHECKS=0;')
con.execute('SET NAMES utf8;')
con.execute('SET CHARACTER SET utf8;')
con.execute('SET character_set_connection=utf8;')
for k, v in DONNEES.items():
v.to_sql(con=con, name=k.lower(), if_exists='append',index=False)
Здесьмои данные, когда я импортирую в MySQL, NaT становится 0000-00-00 (как строка) и NaN "nan" (также как строка ... я также пытался заменить ноль на "NULL", но он остается в виде строки .. . не реальное нулевое значение sql).
print(DONNEES['T_Liste******t'])
CodePersonnel PrenomEnfant NomEnfant DateNaissance DateDeces Enfant*** Sexe ClientPresent Archiver
0 ------- ------- ------- 1985-05-05 NaT NaN 1 0 0
1 ------- ------- ------- 1991-02-11 NaT NaN 2 0 0
2 ------- ------- ------- 1990-01-26 NaT NaN 2 0 0
3 ------- ------- ------- 1982-11-23 NaT NaN 2 0 0
4 ------- ------- ------- 1985-06-07 NaT NaN 1 0 0
... ... ... ... ... ...
(я заменил имена на ------ по безопасности)