利用python通过pymysql实现将某账期的txt文件数据自动导入mysql的表中。此处,txt文件格式为:第一行为列名,和mysql中列名一致(不要求顺序一致)。第二行开始为数据,逗号分隔符。
函数一:python读取txt文件数据
def get_data(file_path,target_date):
"""
file_path:数据文件路径, txt格式
target_date:数据日期
"""
data = []
with io.open(file_path,'r',encoding='utf-8') as f:
delimiter = ',' # txt文件格式的固定分隔符
line = f.readline() # 按行读取
while line:
content = line.split(delimiter) # 数据分割
content[-1] = content[-1].strip('\n') # 要去掉数据结尾的'\n'
data.append(content)
line = f.readline()
return data[0], data[1:] # 返回第一行列名,和去掉第一行的数据
函数二:插入数据
def insert_data_to_mysql(conn,table_name,col_name,data,targetDate):
"""
conn: mysql连接
table_name: 要插入mysql中的表名
col_name: 读取的txt文件中的第一行列名
data: 读取的txt文件中的数据
targetDate: 账期
"""
# 生成插入数据语句 insert into table_name(col_name1, col_name2, ...) values(%s, %s, ...)
column_name = ''
for name in col_name:
column_name = column_name + name + ','
column_name = column_name[:-1] # 去掉最后的逗号
n_col = len(col_name)
column_value = '%s,'*n_col
column_value = column_value[:-1] # 去掉最后的逗号
# 建立游标
cur = conn.cursor()
# 执行插入数据
try:
# 生成完整的插入数据语句
sql_insert = 'INSERT INTO ' + table_name + '(' + column_name + ')' + ' VALUES(' + column_value + ')'
cur.executemany(sql_insert,data)
# 提交任务
conn.commit()
except Exception as e: # 失败回滚
print(str(e))
conn.rollback()
函数三:最终的文件写入函数
def run_file_to_mysql(table_name,target_date):
"""
table_name:要插入mysql的表名,同时也是数据文件名
target_date: 目标账期
"""
## 目标文件名
base_path = '***/' # 目标文件路径
file_path = base_path + table_name + '_' + target_date + '.txt' # 目标文件名:为方便,采用要插入的表名+账期
# 获取数据
try:
col_name,data = get_data(file_path,target_date)
except Exception as e:
print('获取数据失败:', str(e))
return 1
# 建立连接
try:
config = {'host':'****','port':***,'user':'***','passwd':'***','db':'***'}
conn = pymysql.connect(**config)
# 插入数据
try:
insert_data_to_mysql(conn,table_name,col_name,data,target_date)
except Exception as e:
print('插入数据失败:', str(e))
return 1
finally:
# 关闭连接
conn.close()
except Exception as e:
print('连接数据库失败:', str(e))
return 1
return 0
主函数:
def main():
# 导入日期
targetDate = '2022-12-31'
# 导入表名
tableName = 'test'
# 执行任务
code = run_file_to_mysql(tableName,targetDate)
if code == 0:
print('success!')
else:
print('error')
if __name__ == '__main__':
main()