Python / MySQL - переименовать файл CSV

Я создал небольшое приложение для экспорта данных из моей базы данных mysql в csv, оно работает, но если я хочу создать другой отчет, выдается следующая ошибка:

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()
# csv tkinter
Источник
  • 2
    OUTFILE нужно будет создавать динамически, имеет ли это смысл?
  • 0
    как насчет использования try-except и счетчика, используя значение счетчика в имени файла, увеличивая счетчик каждый раз, когда возникает это исключение?
  • 0
    Лучшей практикой @DeepSpace было бы использование os для проверки существования файла, а не try/except
  • 0
    @aws_apprentice, тогда OP нужно будет каждый раз начинать с 0 и проверять, существует ли файл, пока они не найдут имя, которого не существует. Моя идея - наоборот. В любом случае идея та же. Кроме того, концепция EAFP отдает предпочтение try-except (игнорируя небольшие накладные расходы, которые она добавляет). Он также менее подвержен en.wikipedia.org/wiki/Time-of-check_to_time-of-use
  • 0
    На самом деле @aws_apprentice, как только становится возможным состояние гонки, попытка / except ЯВЛЯЕТСЯ «лучшей практикой» - файл с тем же именем вполне может быть создан другим процессом между проверкой os.path.exists и курсором. выполнить вызов.
  • 0
    где здесь состояние гонки?
  • 0
    Лично я обычно добавляю отметку времени к своим именам файлов.
Codelisting
за 0 против

Вам нужно добавить некоторый уровень динамического именования. Лично я использую временные метки.

Например, я использую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 с отметкой времени. Изображение 337485

за 0 против

Вы можете импортировать класс ошибки:

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
Codelisting
Популярные категории
На заметку программисту