Wir haben ein GUI-Tool erstellt, das die CSV der Temperaturanstiegsdaten eines bestimmten Objekts automatisch in Excel konvertiert, die Temperaturanstiegszeit eingibt, die Zellen bei jeder Temperatur färbt und ein Diagramm erstellt.
・ GUI
-Automatisch erstellte Excel-Datei (* Grafik ist gefüllt)
ExcelMaker.pyw
import os, sys
import pandas as pd
import openpyxl as px
import tkinter as tk
import tkinter.filedialog as fl
import tkinter.messagebox as mb
from openpyxl.chart import ScatterChart, Reference, Series
from openpyxl.styles import PatternFill
#Dateiauswahlfunktion
def select_file():
global file_path
filetype = [("all file", "*.csv")] #CSV-Datei anzeigen
iDir = os.path.abspath(r"<Verzeichnispfad>") #最初に表示したいVerzeichnispfad
file_path = fl.askopenfilename(initialdir=iDir, filetypes=filetype) #Pfad angeben
file1.set(file_path) #Ausgewählten Pfad anzeigen
#Excel-Erstellungsfunktion
def make_excel():
excel_name = str(os.path.splitext(file_path)[0]) + "-1.xlsx" #Excel-Name
df = pd.read_csv(file_path, skiprows=57, usecols=[2], encoding="cp932") #Lesen Sie CSV
df.drop(df.tail(3).index, inplace=True) #Löschen Sie die letzten 3 Zeilen und ersetzen Sie die Datei
df_float = df.astype("float").round(1) #Runden Sie mit dem ersten Dezimalpunkt
#Wenn es eine Datei mit demselben Namen gibt, prüfen Sie, ob Sie sie überschreiben möchten
if os.path.isfile(excel_name):
res = mb.askquestion("", "Es gibt eine Datei mit demselben Namen. Möchtest du überschreiben?")
#Datei überschreiben
if res == "yes":
df_float.to_excel(excel_name, header=False, index=False)
#Beenden Sie das Programm
elif res == "no":
mb.showinfo("", "Bitte überprüfen Sie den Dateinamen erneut")
sys.exit()
#Erstellen Sie eine neue Datei
else:
df_float.to_excel(excel_name, header=False, index=False)
#Excel-Operationsbeziehungen
wb = px.load_workbook(excel_name)
ws = wb.active
sheet = wb["Sheet1"]
sc = sheet.cell
wc = ws.cell
sheet.insert_cols(0, 1) #Fügen Sie am Anfang eine Spalte ein
temp_var = int(entry_temp.get()) - 10 #Zieltemperatur-10℃
start = 1 #Startzeit für Temperaturanstieg
cell_diff1 = 0 #Unterschied zwischen oberen und unteren Zellen
#Beim Vergleich der oberen und unteren Zellen beginnt der Temperaturanstieg, wenn die Temperatur dreimal hintereinander um das Dreifache oder mehr steigt.
while cell_diff1 <= 3:
start += 1
cell_diff3 = float(sc(row=start+1, column=2).value) - float(sc(row=start, column=2).value)
if cell_diff3 >= 3:
cell_diff2 = float(sc(row=start+2, column=2).value) - float(sc(row=start+1, column=2).value)
if cell_diff2 >= 3:
cell_diff1 = float(sc(row=start+3, column=2).value) - float(sc(row=start+2, column=2).value)
end = start #Letzte Datenzeile
v1 = 0 #Temperaturanstiegszeit
#Die Temperaturanstiegszeit beträgt 0.Geben Sie jeweils 5 ein
while sc(row=end, column=2).value is not None:
wc(row=end, column=1, value=v1)
end += 1
v1 += 0.5
keep = start #Retentionsstartzeit
fill = PatternFill(fill_type="solid", fgColor="FFFF00") #Füllen Sie die Zelle mit Gelb
temp_var = int(entry_temp.get()) - 10 #Zieltemperatur-10℃
#Zieltemperatur-10 ° C Linie
while sc(row=keep, column=2).value <= temp_var:
keep += 1
#Wenn die erste Ziffer 5 ist, gehen Sie eine Zeile nach unten
if str(sc(row=keep, column=1).value)[-1] == str(5):
keep = keep + 1
#Färben Sie die Zelle für die Startzeit der Aufbewahrung
wc(row=keep, column=1).fill = fill
wc(row=keep, column=2).fill = fill
v2 = 0 #Temperaturanstiegszeit
#Zieltemperatur-Die Retentionszeit beträgt 0 ab 10 ℃.Geben Sie jeweils 5 ein
while keep != end:
wc(row=keep, column=3, value=v2)
keep += 1
v2 += 0.5
#Färben Sie die Zelle für die relevante Retentionszeit
if int(entry_time1.get()) == v2 or int(entry_time2.get()) == v2 or int(entry_time3.get()) == v2:
wc(row=keep, column=1).fill = fill
wc(row=keep, column=2).fill = fill
wc(row=keep, column=3).fill = fill
max_entry_time = keep #Maximale Retentionszeit
#Richten Sie das Zellenformat an der ersten Fraktion aus
for row in sheet:
for cell in row:
cell.number_format = "0.0"
#Diagramm erstellen
chart = ScatterChart()
x_values = Reference(ws, min_row=start, min_col=1, max_row=end, max_col=1) #x-Achse(Temperaturanstiegszeit)
y_values = Reference(ws, min_row=start, min_col=2, max_row=end, max_col=2) #y-Achse(Temperatur)
graph = Series(y_values, x_values)
chart.series.append(graph)
ws.add_chart(chart, "D"+str(max_entry_time)) #Diagramm am Ende der Aufbewahrung in Reihe anzeigen
wb.save(excel_name) #Excel-Datei speichern
mb.showinfo("", "Ich habe eine Excel-Datei erstellt")
#Erstellen einer GUI
if __name__ == "__main__":
root = tk.Tk()
root.title("Konvertieren Sie CSV in Excel")
#frame1
frame1 = tk.LabelFrame(root, text="Dateien auswählen")
frame1.grid(row=0, columnspan=2, sticky="we", padx=5)
#Auswahltaste
select_button = tk.Button(frame1, text="Wahl", command=select_file, width=10)
select_button.grid(row=0, column=3)
#Dateipfad anzeigen
file1 = tk.StringVar()
file1_entry = tk.Entry(frame1, textvariable=file1, width=35)
file1_entry.grid(row=0, column=2, padx=5)
#frame2
frame2 = tk.LabelFrame(root, text="Bedingungen")
frame2.grid(row=1, sticky="we")
#Zieltemperaturtext
text_temp = tk.Label(frame2, text="Zieltemperatur (℃)", width=20)
text_temp.grid(row=0, column=0, padx=5)
#Text zur Aufbewahrungszeit
text_time = tk.Label(frame2, text="Retentionszeit (Sekunden):Mehrere Spezifikationen sind möglich", width=25)
text_time.grid(row=0, column=1)
#Schaltfläche "Ausführen"
action_button = tk.Button(frame2, text="Lauf", command=make_excel, width=15)
action_button.grid(row=3, column=0)
#Zieltemperatur-Eingabefeld
entry_temp = tk.Entry(frame2, width=15)
entry_temp.grid(row=1, column=0, padx=5)
#Eingabefeld für die Aufbewahrungszeit
entry_time1 = tk.Entry(frame2, width=15)
entry_time1.grid(row=1, column=1, padx=5, pady=5)
entry_time1.insert(tk.END, 0)
entry_time2 = tk.Entry(frame2, width=15)
entry_time2.grid(row=2, column=1, padx=5, pady=5)
entry_time2.insert(tk.END, 0)
entry_time3 = tk.Entry(frame2, width=15)
entry_time3.grid(row=3, column=1, padx=5, pady=5)
entry_time3.insert(tk.END, 0)
root.mainloop()
ExcelMaker.pyw
import os, sys
import pandas as pd
import openpyxl as px
import tkinter as tk
import tkinter.filedialog as fl
import tkinter.messagebox as mb
from openpyxl.chart import ScatterChart, Reference, Series
from openpyxl.styles import PatternFill
Importieren Sie die erforderlichen Module.
Erstellen Sie eine GUI mit tkinter
, lesen Sie CSV mit pandas
und betreiben Sie Excel mit openpyxl
.
ExcelMaker.pyw
#Dateiauswahlfunktion
def select_file():
global file_path
filetype = [("all file", "*.csv")] #CSV-Datei anzeigen
iDir = os.path.abspath(r"<Verzeichnispfad>") #最初に表示したいVerzeichnispfad
file_path = fl.askopenfilename(initialdir=iDir, filetypes=filetype) #Pfad angeben
file1.set(file_path) #Ausgewählten Pfad anzeigen
Erstellt den Prozess, wenn die Auswahltaste gedrückt wird. Verwenden Sie "Dateityp", um nur CSV anzuzeigen, und geben Sie "iDir" als erstes Verzeichnis an, das geöffnet wird, wenn die Auswahltaste gedrückt wird. In IDLE, das dieses Mal für die Entwicklungsumgebung verwendet wird, kann beim Einschließen einer Zeichenfolge in Anführungszeichen ein Fehler auftreten, es sei denn, am Anfang wird "r" hinzugefügt. Geben Sie ihn daher ein.
Holen Sie sich den in filesialog.askopenfilename
ausgewählten Dateinamen und setzen Sie ihn auf global
, da Sie ihn in anderen Funktionen verwenden möchten.
Wählen Sie den Dateipfad mit file1.set (file_path)
aus und zeigen Sie ihn im Rahmen links von der Schaltfläche an.
ExcelMaker.pyw
#Excel-Erstellungsfunktion
def make_excel():
excel_name = str(os.path.splitext(file_path)[0]) + "-1.xlsx" #Excel-Name
df = pd.read_csv(file_path, skiprows=57, usecols=[2], encoding="cp932") #Lesen Sie CSV
df.drop(df.tail(3).index, inplace=True) #Löschen Sie die letzten 3 Zeilen und ersetzen Sie die Datei
df_float = df.astype("float").round(1) #Runden Sie mit dem ersten Dezimalpunkt
#Wenn es eine Datei mit demselben Namen gibt, prüfen Sie, ob Sie sie überschreiben möchten
if os.path.isfile(excel_name):
res = mb.askquestion("", "Es gibt eine Datei mit demselben Namen. Möchtest du überschreiben?")
#Datei überschreiben
if res == "yes":
df_float.to_excel(excel_name, header=False, index=False)
#Beenden Sie das Programm
elif res == "no":
mb.showinfo("", "Bitte überprüfen Sie den Dateinamen erneut")
sys.exit()
#Erstellen Sie eine neue Datei
else:
df_float.to_excel(excel_name, header=False, index=False)
Extrahieren Sie zunächst die erforderlichen Teile aus der obigen CSV und machen Sie daraus eine Excel-Datei. Um CSV in einen Excel-Namen zu konvertieren, verwenden Sie "str (os.path.splitext (file_path) [0]) +" -1.xlsx ", um den Punkt nach dem letzten Punkt (.csv) des Dateipfads zu löschen, und" Addiere -1.xlsx`.
Lesen Sie die CSV mit pd.read_csv
.
Da die erforderlichen Daten ab der 58. Zeile in der zweiten Spalte vorhanden waren, geben Sie als Argumente skiprows = 57, usecols = [2]
an.
Wenn es unverändert bleibt, tritt aufgrund des Typs ein Fehler auf. Geben Sie daher "encoding =" cp932 "" an.
Da in den letzten 3 Zeilen der gelesenen CSV unnötige Daten vorhanden waren, löschen Sie diese mit "df.drop (df.tail (3) .index)" und ersetzen Sie die CSV-Datei erneut durch "inplace = True". Es ist ein Gleitkommatyp, der an der ersten Stelle mit "df.astype" ("float") gerundet wird. Round (1) ".
Suchen Sie die Excel-Datei, die Sie mit if os.path.isfile (excel_name):
erstellen möchten, um zu verarbeiten, ob eine Datei mit demselben Namen vorhanden ist.
Wenn der bedingte Ausdruck "True" ist, fahren Sie mit der nächsten if-Anweisung fort (== True kann weggelassen werden). In anderen Fällen wird eine neue Excel-Datei erstellt.
Wenn es eine Datei mit demselben Namen gibt, wird in messagebox.askquestion
ein Fenster zur Auswahl von" Ja "und" Nein "angezeigt.
Ich verstehe die Details noch nicht, aber zu diesem Zeitpunkt habe ich die Variable nur als "res = messagebox.askquestio" definiert, aber der Prozess funktioniert tatsächlich und das Fenster wird angezeigt.
Wenn Sie versuchen, es im Voraus zu definieren, wird es daher an einer unerwarteten Stelle angezeigt. Beschreiben Sie es daher unbedingt zu dem Zeitpunkt, zu dem Sie es anzeigen möchten.
Der Rückgabewert von "messagebox.askquestio" ist "yes = yes" und "no = no". Wenn ja, wird die Excel-Datei unverändert überschrieben. Wenn nein, wird die Nachricht angezeigt und das Programm mit "sys.exit ()" beendet. Machen.
Bis zu diesem Punkt haben Sie eine Excel-Datei, die die Temperaturänderungsdaten in der zweiten Spalte enthält, wie unten gezeigt.
ExcelMaker.pyw
#Excel-Operationsbeziehungen
wb = px.load_workbook(excel_name)
ws = wb.active
sheet = wb["Sheet1"]
sc = sheet.cell
wc = ws.cell
sheet.insert_cols(0, 1) #Fügen Sie am Anfang eine Spalte ein
temp_var = int(entry_temp.get()) - 10 #Zieltemperatur-10℃
start = 1 #Startzeit für Temperaturanstieg
cell_diff1 = 0 #Unterschied zwischen oberen und unteren Zellen
#Beim Vergleich der oberen und unteren Zellen beginnt der Temperaturanstieg, wenn die Temperatur dreimal hintereinander um das Dreifache oder mehr steigt.
while cell_diff1 <= 3:
start += 1
cell_diff3 = float(sc(row=start+1, column=2).value) - float(sc(row=start, column=2).value)
if cell_diff3 >= 3:
cell_diff2 = float(sc(row=start+2, column=2).value) - float(sc(row=start+1, column=2).value)
if cell_diff2 >= 3:
cell_diff1 = float(sc(row=start+3, column=2).value) - float(sc(row=start+2, column=2).value)
end = start #Letzte Datenzeile
v1 = 0 #Temperaturanstiegszeit
#Die Temperaturanstiegszeit beträgt 0.Geben Sie jeweils 5 ein
while sc(row=end, column=2).value is not None:
wc(row=end, column=1, value=v1)
end += 1
v1 += 0.5
Vergleichen Sie die oberen und unteren Zellen mit while cell_diff1 <= 3:
, und wenn die Temperatur dreimal hintereinander um 3 oder mehr ansteigt, beginnt der Temperaturanstieg.
Vergleichen Sie zunächst die Startzeile und die folgende Zeile mit "cell_diff3 = float (sc (Zeile = Start + 1, Spalte = 2) .Wert) --float (sc (Zeile = Start, Spalte = 2) .Wert)" und 3 Vergleichen Sie im obigen Fall eine Zeile nach unten mit "cell_diff2" auf die gleiche Weise, und wenn "dell_diff1" 3 oder mehr wird, endet die while-Anweisung.
Wenn Sie die Zeile kennen, in der mit dem Erwärmen begonnen werden soll, geben Sie die Erwärmungszeit in der ersten Spalte mit while sc (Zeile = Ende, Spalte = 2) ein. Der Wert ist nicht None:
, bis der Wert in der Spalte für die Temperaturänderung leer ist. Ich werde fortsetzen.
ExcelMaker.pyw
keep = start #Retentionsstartzeit
fill = PatternFill(fill_type="solid", fgColor="FFFF00") #Füllen Sie die Zelle mit Gelb
temp_var = int(entry_temp.get()) - 10 #Zieltemperatur-10℃
#Zieltemperatur-10 ° C Linie
while sc(row=keep, column=2).value <= temp_var:
keep += 1
#Wenn die erste Ziffer 5 ist, gehen Sie eine Zeile nach unten
if str(sc(row=keep, column=1).value)[-1] == str(5):
keep = keep + 1
#Färben Sie die Zelle für die Startzeit der Aufbewahrung
wc(row=keep, column=1).fill = fill
wc(row=keep, column=2).fill = fill
v2 = 0 #Temperaturanstiegszeit
#Zieltemperatur-Die Retentionszeit beträgt 0 ab 10 ℃.Geben Sie jeweils 5 ein
while keep != end:
wc(row=keep, column=3, value=v2)
keep += 1
v2 += 0.5
#Färben Sie die Zelle für die relevante Retentionszeit
if int(entry_time1.get()) == v2 or int(entry_time2.get()) == v2 or int(entry_time3.get()) == v2:
wc(row=keep, column=1).fill = fill
wc(row=keep, column=2).fill = fill
wc(row=keep, column=3).fill = fill
max_entry_time = keep #Maximale Retentionszeit
#Richten Sie das Zellenformat an der ersten Fraktion aus
for row in sheet:
for cell in row:
cell.number_format = "0.0"
temp_var = int (entry_temp.get ()) --10
, um den Wert der Zieltemperatur -10 get zu erhalten, undwhile sc (row = keep, column = 2) .value <= temp_var:
, um den Wert zu erhalten. Untersuche die Linie.
Zu diesem Zeitpunkt, wenn der erste Dezimalpunkt der Temperaturanstiegszeit 5 ist, senkt str (sc (Zeile = behalten, Spalte = 1) .Wert) [-1] == str (5): eine Zeile.
Wenn Sie die Startzeile der Aufbewahrung kennen, geben Sie die Aufbewahrungszeit bis zur letzten Zeile mit while keep! = End:
ein.
Zu diesem Zeitpunkt ist "if int (entry_time1.get ()) == v2 oder int (entry_time2.get ()) == v2 oder int (entry_time3.get ()) == v2:" dieselbe Zeile wie die angegebene Aufbewahrungszeit Holen Sie sich die Zeile mit der längsten Aufbewahrungszeit mit "max_entry_time = keep", um sie auszufüllen und zu entscheiden, wo das Diagramm platziert werden soll.
für Zeile in Blatt:
gibt die gesamte Zeile des Blattes an, für Zelle in Zeile:
gibt die gesamte Spalte an, und cell.number_format =" 0.0 "
richtet das Zellenformat am ersten Dezimalpunkt aus.
ExcelMaker.pyw
#Diagramm erstellen
chart = ScatterChart()
x_values = Reference(ws, min_row=start, min_col=1, max_row=end, max_col=1) #x-Achse(Temperaturanstiegszeit)
y_values = Reference(ws, min_row=start, min_col=2, max_row=end, max_col=2) #y-Achse(Temperatur)
graph = Series(y_values, x_values)
chart.series.append(graph)
ws.add_chart(chart, "D"+str(max_entry_time)) #Diagramm am Ende der Aufbewahrung in Reihe anzeigen
wb.save(excel_name) #Excel-Datei speichern
mb.showinfo("", "Ich habe eine Excel-Datei erstellt")
chart = ScatterChart ()
für ein Streudiagramm, x_values = Referenz (ws, min_row = start, min_col = 1, max_row = end, max_col = 1)
für die erste Spalte auf der X-Achse, y_values = Reference ( Geben Sie die zweite Spalte auf der Y-Achse mit ws an, min_row = start, min_col = 2, max_row = end, max_col = 2)
.
Geben Sie die X- und Y-Achse mit graph = Series (y_values, x_values)
an und fügen Sie sie mit chart.series.append (graph)
hinzu.
Zum Schluss platzieren Sie mit ws.add_chart (Diagramm," D "+ str (max_entry_time))
das Diagramm in der Zeile am Ende der Aufbewahrung in Spalte D (4. Spalte), speichern die Datei und beenden.
ExcelMaker.pyw
#Erstellen einer GUI
if __name__ == "__main__":
root = tk.Tk()
root.title("Konvertieren Sie CSV in Excel")
#frame1
frame1 = tk.LabelFrame(root, text="Dateien auswählen")
frame1.grid(row=0, columnspan=2, sticky="we", padx=5)
#Auswahltaste
select_button = tk.Button(frame1, text="Wahl", command=select_file, width=10)
select_button.grid(row=0, column=3)
#Dateipfad anzeigen
file1 = tk.StringVar()
file1_entry = tk.Entry(frame1, textvariable=file1, width=35)
file1_entry.grid(row=0, column=2, padx=5)
#frame2
frame2 = tk.LabelFrame(root, text="Bedingungen")
frame2.grid(row=1, sticky="we")
#Zieltemperaturtext
text_temp = tk.Label(frame2, text="Zieltemperatur (℃)", width=20)
text_temp.grid(row=0, column=0, padx=5)
#Text zur Aufbewahrungszeit
text_time = tk.Label(frame2, text="Retentionszeit (Sekunden):Mehrere Spezifikationen sind möglich", width=25)
text_time.grid(row=0, column=1)
#Schaltfläche "Ausführen"
action_button = tk.Button(frame2, text="Lauf", command=make_excel, width=15)
action_button.grid(row=3, column=0)
#Zieltemperatur-Eingabefeld
entry_temp = tk.Entry(frame2, width=15)
entry_temp.grid(row=1, column=0, padx=5)
#Eingabefeld für die Aufbewahrungszeit
entry_time1 = tk.Entry(frame2, width=15)
entry_time1.grid(row=1, column=1, padx=5, pady=5)
entry_time1.insert(tk.END, 0)
entry_time2 = tk.Entry(frame2, width=15)
entry_time2.grid(row=2, column=1, padx=5, pady=5)
entry_time2.insert(tk.END, 0)
entry_time3 = tk.Entry(frame2, width=15)
entry_time3.grid(row=3, column=1, padx=5, pady=5)
entry_time3.insert(tk.END, 0)
root.mainloop()
Erstellen Sie diesen Bildschirm. Als Struktur sind ein Feld und eine Auswahlschaltfläche zum Anzeigen des Pfads der ausgewählten Datei in Bild 1 angeordnet, ein Feld zum Eingeben der Zieltemperatur und der Retentionszeit und eine Ausführungsschaltfläche in Bild 2.
Geben Sie grundsätzlich "tk.Label" für Sätze, "tk.Button" für Schaltflächen, "tk.Entry" für Eingabefelder an und platzieren Sie es an einer beliebigen Stelle mit "grid". Wenn Sie die Verarbeitung hinzufügen möchten, wenn die Schaltfläche gedrückt wird, geben Sie die Funktion im Argument "Befehl" an. Wenn Sie den Anfangswert in das Eingabefeld einfügen möchten, geben Sie den Wert mit ".insert" an.
Wenn Sie die Erweiterung auf ".pyw" setzen, wird der schwarze Bildschirm des Hintergrunds beim Starten des Programms nicht angezeigt.
Dieses Mal habe ich etwas erstellt, das sowohl in meiner täglichen Arbeit als auch im Studium automatisiert werden kann, aber da ich die Arbeit selbst verstanden habe, konnte ich das Programm selbst relativ einfach erstellen. (2H / Tag x 10 Tage)
Wenn Sie über den zukünftigen Kurs nachdenken, scheinen Ingenieure (RPA-Ingenieure?), Die Unternehmen solche Programme zur Verbesserung der Arbeitseffizienz vorstellen, interessant zu sein, daher werde ich sie als Optionen betrachten.
Recommended Posts