Python/MySQL-重命名CSV文件

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

我创建了一个小应用程序,以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.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调用之间的另一个进程很可能创建同名文件。