【问题标题】:Python/MySQL - Rename CSV filePython/MySQL - 重命名 CSV 文件
【发布时间】:2020-04-11 02:55:47
【问题描述】:

我创建了一个小应用程序以 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()

【问题讨论】:

  • OUTFILE 必须动态创建,这有意义吗?
  • 如何使用try-except 和一个计数器,使用文件名中的计数器值,每次引发异常时增加计数器?
  • @DeepSpace 更好的做法是使用os 模块来检查文件是否存在,而不是try/except
  • @aws_apprentice 那么OP每次都需要从0开始,并检查文件是否存在,直到找到不存在的名称。我的想法是相反的。在任何情况下,想法都是一样的。此外,EAFP 概念更喜欢try-except 方法(忽略它增加的小开销)。它也不太容易出现en.wikipedia.org/wiki/Time-of-check_to_time-of-use
  • @aws_apprentice 实际上,只要可能出现竞争条件,try/except 就是“最佳实践”——操作系统之间的另一个进程很可能会创建同名文件。 path.exists 检查和 cursor.execute 调用。

标签: python mysql csv tkinter


【解决方案1】:

您可以导入错误类:

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

【讨论】:

    【解决方案2】:

    您需要添加某种级别的动态命名。我个人使用时间戳。

    例如,我使用 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)
    

    如您所见,我的 docs 文件夹中现在有一个带有时间戳的 excel 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-05
      • 2011-07-04
      • 2021-01-16
      • 2021-08-10
      • 2014-06-01
      • 2017-12-23
      • 2018-02-26
      • 2010-10-13
      相关资源
      最近更新 更多