Python/MySQL-重命名CSV文件
我创建了一个小应用程序,以csv格式从mysql数据库导出数据,它可以工作,但如果我想创建另一个报告,则会出现以下错误: pymysql.err.InternalError:(1086,“文件'/TEMP/.CSV'已存在”) 是,该文件已存在。我的问题是,如何生成两个报告,即使名称相同。例如hi.csv,然后是hi.csv(1) 代码如下:Python/MySQL-重命名CSV文件,python,mysql,csv,tkinter,Python,Mysql,Csv,Tkinter,我创建了一个小应用程序,以csv格式从mysql数据库导出数据,它可以工作,但如果我想创建另一个报告,则会出现以下错误: pymysql.err.InternalError:(1086,“文件'/TEMP/.CSV'已存在”) 是,该文件已存在。我的问题是,如何生成两个报告,即使名称相同。例如hi.csv,然后是hi.csv(1) 代码如下: import tkinter as tk import pymysql root = tk.Tk() root.geometry("") root.t
import tkinter as tk
import pymysql
root = tk.Tk()
root.geometry("")
root.title("excel teste")
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
with conn:
print("connect successfull!")
cursor = conn.cursor()
with cursor:
cursor.execute("SELECT VERSION()")
versao = cursor.fetchone()
print("Versão do gerenciador Maria DB: %s" % versao)
def exp_rel_con_pag():
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
with conn:
statm = "SELECT * FROM omniacademp INTO OUTFILE '/TEMP/"".CSV' FIELDS TERMINATED BY ',' ENCLOSED BY ''"
cursor = conn.cursor()
with cursor:
cursor.execute(statm)
results = cursor.fetchone()
print(results)
tk.Button(root, width=15, text="run", command=exp_rel_con_pag).place(x=10, y=10)
root.mainloop()
您可以导入错误类:
from pymysql.err import InternalError
添加一个计数器:
fileIndex = 0
然后查看该文件是否已存在:
try:
statm = "SELECT * FROM omniacademp INTO OUTFILE '/TEMP/HI.CSV' FIELDS TERMINATED BY ',' ENCLOSED BY ''"
cursor.execute(statm)
except InternalError:
statm = "SELECT * FROM omniacademp INTO OUTFILE '/TEMP/HI ({}).CSV' FIELDS TERMINATED BY ',' ENCLOSED BY ''".format(fileIndex)
cursor.execute(statm)
fileIndex += 1
您需要添加一些级别的动态命名。我个人使用时间戳 例如,我使用
openpyxl
编写excel文件,并使用datetime
作为时间戳
通过使用一个时间戳到秒,您几乎不可能对文件名有任何问题
这是我有数据要写时使用的代码
import os
import openpyxl
from datetime import datetime as dt
list_of_data = [['row1'], ['row2'], ['row3'], ['row4']]
wb = openpyxl.Workbook() # create workbook
main_ws = wb.worksheets[0] # designate what worksheet I am working on.
for sub_list in list_of_data:
main_ws.append(sub_list) # writing data to each row.
# creating timestamp while removing special characters.
time_stamp = ''.join([{'-': '', ' ': '', ':': '', '.': ''}.get(c, c) for c in str(dt.now())])[0:12]
# build file name.
file_name = '{} - {}.xlsx'.format('report', time_stamp)
# using os library to build path to my local documents folder.
path = os.path.join(os.environ['USERPROFILE'], 'Documents', file_name)
# saving wb.
wb.save(filename=path)
如您所见,我现在在我的文档文件夹中有一个带有时间戳的excel文件。
必须动态创建
OUTFILE
,这有意义吗?使用try except
和计数器,使用文件名中的计数器值,每次引发异常时增加计数器?@DeepSpace更好的做法是使用os
模块检查文件是否存在,而不是try/except
@aws\u peedient,那么OP每次都需要从0开始,并检查文件是否存在,直到找到不存在的名称。我的想法正好相反。无论如何,想法都是一样的。此外,EAFP概念更喜欢try-except
方法(忽略它增加的小开销)。@aws_peedient也不太容易出现。事实上,只要有竞争条件,try/except就是“最佳实践”——在os.path.exists检查和cursor.execute调用之间的另一个进程很可能创建同名文件。