Verschiedene Programme und Tools, die ich kürzlich für den persönlichen Gebrauch erstellt habe.
https://github.com/dede-20191130/CreateToolAndTest
1.Python
Wenn Sie Ordner mit alten Namen nicht bewusst organisieren, werden sie für immer gespeichert. Ich wollte es abschneiden.
Crean_OldNamed_Folders.py
import glob
import os
import tkinter as tk
import tkinter.simpledialog as sim
from tkinter import messagebox
import send2trash
def Main():
root = tk.Tk()
root.withdraw()
tmpPath = sim.askstring("alte Ordnersuche Ordnerspezifikation", "Bitte geben Sie den Ordnerpfad an, um den alten Ordner zu durchsuchen", initialvalue="")
if tmpPath not in (None, ''):
ThrowAwayOld(tmpPath)
def ThrowAwayOld(baseFolderPath):
"""Suchen Sie rekursiv nach alten Ordnern und senden Sie deren Inhalt in den Papierkorb"""
if not os.path.isdir(baseFolderPath):
messagebox.showerror("Error", "Ein Ordnerpfad, der nicht vorhanden ist.")
exit(1)
rmNum = 0
for f in glob.glob(baseFolderPath + '\\**', recursive=True):
if os.path.isdir(f) and os.path.basename(f).lower() in ('old', 'alt', 'Alt'):
send2trash.send2trash(os.path.abspath(f))
rmNum += 1
messagebox.showinfo("Erfolgreiche Fertigstellung", "Der Vorgang ist abgeschlossen.\n" + str(rmNum) + "Ich habe einen alten Ordner in den Papierkorb geschickt.")
if __name__ == '__main__':
Main()
for f in glob.glob(baseFolderPath + '\\**', recursive=True):
if os.path.isdir(f) and os.path.basename(f).lower() in ('old', 'alt', 'Alt'):
send2trash.send2trash(os.path.abspath(f))
rmNum += 1
Die rekursive Dateisuche ist möglich, indem in der Funktion glob.glob rekursiv festgelegt wird.
Senden Sie einen Ordner mit Wörtern wie "alt" und "alt" in den Papierkorb.
Ich wollte ein Kissen in Form eines Versandes in den Papierkorb legen, da es beim Entfernen nicht wiederhergestellt werden kann.
Beim Veröffentlichen des Quellcodes in SNS wie Qiita Ich wollte meinen persönlichen Dateipfad oder Dateinamen nicht angeben. Deshalb habe ich ein Programm erstellt, das den Dateipfad sofort ersetzen kann.
ChangePrivatePathsOfText.py
import os
import pathlib
import re
import chardet
def Main():
with pathlib.Path(os.getenv("HOMEDRIVE") + os.getenv(
"HOMEPATH") + r'\PycharmProjects\CreateToolAndTest\PrivateTool\ChangedString.txt') as pp:
#Zeichencode erkennen
with open(pp.absolute(), "rb") as f:
temp = chardet.detect(f.read())['encoding']
#Zeichen eingeben
allText = pp.read_text(encoding=temp)
# ///Ersatz durch regulären Ausdruck
#Dateipfad ersetzen
allText = re.sub(r'"[a-zA-Z]:[\\/].*\.', r'"C:/Users/UserName/MyFolder/Foo.', allText)
allText = re.sub(r"'[a-zA-Z]:[\\/].*\.", r"'C:/Users/UserName/MyFolder/Foo.", allText)
#Ordnerpfad ersetzen
allText = re.sub(r'"[a-zA-Z]:[\\/](?!.*\.).*"',r'"C:/Users/UserName/MyFolder/Foo."',allText)
allText = re.sub(r"'[a-zA-Z]:[\\/](?!.*\.).*'",r"'C:/Users/UserName/MyFolder/Foo.'",allText)
#Ausgabe nach dem Austausch
pp.write_text(allText, encoding=temp)
if __name__ == '__main__':
Main()
Verwendung der Funktionen read_text / write_text und mit Syntax des pathlib-Moduls Vereinfacht die Eingabe / Ausgabe von Dateien.
#Zeichencode erkennen
with open(pp.absolute(), "rb") as f:
temp = chardet.detect(f.read())['encoding']
#Zeichen eingeben
allText = pp.read_text(encoding=temp)
Die gesamte Zeichenfolge wird mit dem zuvor erkannten Zeichencode gelesen.
# ///Ersatz durch regulären Ausdruck
#Dateipfad ersetzen
allText = re.sub(r'"[a-zA-Z]:[\\/].*\.', r'"C:/Users/UserName/MyFolder/Foo.', allText)
allText = re.sub(r"'[a-zA-Z]:[\\/].*\.", r"'C:/Users/UserName/MyFolder/Foo.", allText)
#Ordnerpfad ersetzen
allText = re.sub(r'"[a-zA-Z]:[\\/](?!.*\.).*"',r'"C:/Users/UserName/MyFolder/Foo."',allText)
allText = re.sub(r"'[a-zA-Z]:[\\/](?!.*\.).*'",r"'C:/Users/UserName/MyFolder/Foo.'",allText)
Bezüglich des Dateipfads
Das Ersetzen des regulären Ausdrucks wird unter der Bedingung verwendet.
In Bezug auf den Ordnerpfad,
Das Ersetzen des regulären Ausdrucks wird unter der Bedingung verwendet.
Fast das gleiche wie 1-2
ChangeURLPartsOfText.py
import os
import pathlib
import re
import chardet
def Main():
with pathlib.Path(os.getenv("HOMEDRIVE") + os.getenv(
"HOMEPATH") + r'\PycharmProjects\CreateToolAndTest\PrivateTool\ChangedString.txt') as pp:
#Zeichencode erkennen
with open(pp.absolute(), "rb") as f:
temp = chardet.detect(f.read())['encoding']
#Zeichen eingeben
allText = pp.read_text(encoding=temp)
# print(allText)
#Ersatz durch regulären Ausdruck
allText = re.sub(r'"https?://.*"', r'"http://foobar.com"', allText)
allText = re.sub(r"'https?://.*'", r"'http://foobar.com'", allText)
#Ausgabe nach dem Austausch
pp.write_text(allText, encoding=temp)
if __name__ == '__main__':
Main()
#Ersatz durch regulären Ausdruck
allText = re.sub(r'"https?://.*"', r'"http://foobar.com"', allText)
allText = re.sub(r"'https?://.*'", r"'http://foobar.com'", allText)
Es unterstützt Zeichenfolgen in einfachen oder doppelten Anführungszeichen.
Das Meldungsfeld von Python ist Da verschiedene Vorbereitungen wie das Einstellen des Root-Frames problematisch sind Ich wollte in der Lage sein, eine Nachricht mit einem einzigen Aufruf der statischen Methode anzuzeigen.
TkHandler_MsgBox_1.py
import tkinter as tk
from tkinter import messagebox
class TkHandler_MsgBox_1:
"""
Klasse zur Behandlung von Nachrichtenfeldern_1
"""
def __init__(self):
self.root = tk.Tk()
self.root.withdraw()
def __del__(self):
self.root.destroy()
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def normalMsgBox(self, title='Botschaft', content='ここにBotschaftが表示されます。'):
messagebox.showinfo(title, content)
def errorMsgBox(self, title='Error', content='Errorが発生しました。'):
messagebox.showerror(title, content)
@staticmethod
def showStandardMessage(title, content, isError=False, errorTitle=None, errorContent=None):
"""
Wird verwendet, wenn eine Nachricht im Standardgebrauch angezeigt wird.
Das Tk-Objekt wird sofort freigegeben, ohne es erneut zu verwenden.
:arg
(error)title:(Error)Titel
(error)content:(Error)Nachrichteninhalt
isError:Wenn ein Fehler auftritt, wird eine Fehlermeldung angezeigt.
"""
with TkHandler_MsgBox_1() as objMsg:
myTitle = title if not isError else errorTitle
myContent = content if not isError else errorContent
calledFunc = objMsg.normalMsgBox if not isError else objMsg.errorMsgBox
calledFunc(title=myTitle, content=myContent)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
pass
Das Obige ist der Kontextmanager bei Verwendung der with-Syntax. Referenz: https://python.keicode.com/lang/context-manager.php
Ich werde diesmal nichts tun.
def normalMsgBox(self, title='Botschaft', content='ここにBotschaftが表示されます。'):
messagebox.showinfo(title, content)
def errorMsgBox(self, title='Error', content='Errorが発生しました。'):
messagebox.showerror(title, content)
Bei jedem Aufruf wird eine Nachricht unter den im Argument festgelegten Bedingungen angezeigt. Dieses Mal werden nur die Funktionen implementiert, die der Informationsnachricht und der Fehlermeldung entsprechen.
myTitle = title if not isError else errorTitle
myContent = content if not isError else errorContent
calledFunc = objMsg.normalMsgBox if not isError else objMsg.errorMsgBox
calledFunc(title=myTitle, content=myContent)
Verzweigen Sie Variablen bedingt mit dem ternären Operator gemäß dem Wert von isError.
Die letzte Funktion namens Func ist entweder normalMsgBox oder errorMsgBox.
Verwenden Sie es so. Es kann in einer Zeile aufgerufen werden, ohne dass der Root-Frame festgelegt werden muss.
from Commons.TkHandler_MsgBox_1 import TkHandler_MsgBox_1
TkHandler_MsgBox_1.showStandardMessage('Bearbeitung abgeschlossen', 'Das Verschieben der Datei ist abgeschlossen.')
Mit einem Smartphone aufgenommene Fotos usw. Ich wollte es sowohl auf die Bilder auf meinem PC als auch auf den G-Laufwerksordner verschieben.
CopyPicsToFolders.py
import glob
import os
import sys
#Modul-Suchpfad zurücksetzen
#Ermöglichen Sie einen Doppelklick
sys.path.append(os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + r"\PycharmProjects\CreateToolAndTest")
import shutil
import send2trash
# Common parts in dede-20191130's GitHub
# https://github.com/dede-20191130/CreateToolAndTest
from Commons.TkHandler_MsgBox_1 import TkHandler_MsgBox_1
def Main():
isSuccess = True
try:
mySrcPath = r'C:/Users/UserName/MyFolder/Foo'
myDestpathList = [r'C:/Users/UserName/MyFolder/Bar', r'C:/Users/UserName/MyFolder/Dede']
movedFileList = []
#Holen Sie sich alle Bilddateien direkt in den angegebenen Ordner
if os.path.isdir(mySrcPath):
for file in glob.glob(mySrcPath + '\\*', recursive=False):
if os.path.isfile(file):
movedFileList.append(file)
else:
print('No Directory')
exit(0)
#In den angegebenen Ausgabezielordner kopieren
for dst in myDestpathList:
[shutil.copy(os.path.abspath(file2), dst) for file2 in movedFileList]
except:
isSuccess = False
finally:
if isSuccess:
TkHandler_MsgBox_1.showStandardMessage('Bearbeitung abgeschlossen', 'Das Verschieben der Datei ist abgeschlossen.')
for file in glob.glob(mySrcPath + '\\*', recursive=False):
send2trash.send2trash(os.path.abspath(file))
if __name__ == '__main__':
Main()
except:
isSuccess = False
finally:
if isSuccess:
TkHandler_MsgBox_1.showStandardMessage('Bearbeitung abgeschlossen', 'Das Verschieben der Datei ist abgeschlossen.')
for file in glob.glob(mySrcPath + '\\*', recursive=False):
send2trash.send2trash(os.path.abspath(file))
Wenn Sie die Ausnahme nicht abfangen Zeigen Sie eine Nachricht an, vorausgesetzt, es handelt sich um ein normales Urteil. Senden Sie die Dateien im Originalordner in den Papierkorb.
Wenn Sie die Zeit im Nanosekundenbereich erhalten Ist es möglich, Zufallszahlen auf menschlicher Erfahrungsebene zu erhalten? Ich habe es gemacht.
DiceAppWithoutRandomLibrary.py
import time
import tkinter as tk
from tkinter import messagebox
def diceResult():
#Zufällige variable Erfassung je nach Zeit (in menschlicher Erfahrungszeit)
temp = int((time.time_ns() % 100000000) / 100)
#Holen Sie sich den Rest geteilt durch 6
myTempRmd = temp % 6
if myTempRmd == 0:
myTempRmd = 6
return myTempRmd
if __name__ == '__main__':
#Erhalten Sie Würfelergebnisse
result = diceResult()
#Wird als Ergebnis des Würfelns als Nachricht angezeigt
root = tk.Tk()
root.withdraw() #Zeigen Sie keine kleinen Fenster
messagebox.showinfo("Würfel", "Das Ergebnis ist" + str(result) + "ist")
2.Powershell
vor dem Schlafen, Wenn ich versuche zu schlafen, nachdem ich Dateien auf das G-Laufwerk übertragen habe Sie müssen warten, bis die Übertragung abgeschlossen ist. Ich habe ein Skript erstellt, um es nach einer bestimmten Zeit (nach Abschluss der Übertragung) in den Ruhezustand zu versetzen.
hibernationTimer.ps1
Param(
[long]$waitTime = 300 #Wartezeit (en)
)
sleep $waitTime
#Überwintern
shutdown -h
#Schließen Sie nur das Konsolenfenster, in dem dieses Skript ausgeführt wird (PID ist eine automatische Variable, die die Prozess-ID der ausgeführten PowerShell festlegt).
Stop-Process -Id $PID
Geben Sie die im Argument angegebene Anzahl von Sekunden an (Standard ist 300 Sekunden). Führen Sie auf der Konsole aus.
Schließt automatisch den Konsolenbildschirm, wenn Sie in den Ruhezustand wechseln.
Wenn Sie mit den Ordnern beginnen können, die Sie immer vergleichen (alte und neue Projektordner usw.) Erstellt den Gedanken, dass es nicht erforderlich ist, es jedes Mal auf dem Bildschirm für die Ordnerspezifikation anzugeben.
Fügen Sie der Powershell-Profildatei Folgendes hinzu.
powershell:Microsoft.PowerShellISE_profile.ps1
Sal wmg C:\Tool_nonInstall\winmerge-2.16.4-x64-exe\WinMerge\WinMergeU.exe
function wtmp() {
wmg $HOME\Documents\Dif_1 $HOME\Documents\Dif_2
}
Wenn Sie "wtmp" auf der Konsole ausführen Starten Sie WinMerge mit Dif_1 und Dif_2 im Vergleich.
3.ExcelVBA
Bei der Übergabe des Excel-Buches an die andere Partei Das Blatt ist das Blatt ganz links. Einige Leute beschweren sich, dass der Cursor nicht auf Zelle A1 zeigt.
Ein Werkzeug, um zu verhindern, dass solche Leute etwas sagen.
Werkzeug
'******************************************************************************************
'*Funktionsname: formatForSubmission
'*Funktion: Sie können dies schnell tun, wenn Sie das Erscheinungsbild beim Einreichen des Excel-Buches an die andere Partei festlegen müssen.
'Bewegen Sie die Cursor aller Blätter in die obere linke Zelle (A1-Zelle) und aktivieren Sie das Blatt ganz links.
'*Streit(1):Keiner
'******************************************************************************************
Public Sub formatForSubmission()
'Konstante
Const FUNC_NAME As String = "formatForSubmission"
'Variable
Dim cntObj As Object 'Schleifenzähler
On Error GoTo ErrorHandler
'---Beschreiben Sie den folgenden Prozess---
'Bewegen Sie den Cursor aller Blätter in die obere linke Zelle (A1-Zelle).
For Each cntObj In Worksheets
'Überspringe versteckte Zellen
If cntObj.Visible = True Then
cntObj.Select
cntObj.Range("A1").Select
End If
Next
'Wählen Sie das sichtbarste Blatt mit der niedrigsten Nummer
For Each cntObj In Worksheets
If cntObj.Visible = True Then
cntObj.Select
Exit For
End If
Next
ExitHandler:
Exit Sub
ErrorHandler:
MsgBox "Ein Fehler ist aufgetreten, also beenden Sie" & _
vbLf & _
"Funktionsname:" & FUNC_NAME & _
vbLf & _
"Fehlernummer" & Err.Number & Chr(13) & Err.Description, vbCritical
GoTo ExitHandler
End Sub
Beim Erstellen eines Abschriftensatzes Zitat ">" einfügen und Zeilendekoration "(vor und nach Satz) ~" einfügen Ich wollte ein Werkzeug, das es einfach macht.
Werkzeug
'Für ein bestimmtes Objekt oder einen bestimmten Wert
'Stellt die Position dar, an der die Funktionsverarbeitung ausgeführt werden soll
Public Enum ProcessingPosition
Front = 1
Back = 2
Both = 3
End Enum
'******************************************************************************************
'*Funktionsname: insertStrToSelection
'*Funktion: Fügt eine Zeichenfolge an der angegebenen Position des Werts aller Zellen im ausgewählten Bereich ein.
'*Bestimmte Position: vorne / hinten oder vorne und hinten
'*Streit(1):Keiner
'******************************************************************************************
Public Sub insertStrToSelection()
'Konstante
Const FUNC_NAME As String = "insertStrToSelection"
'Variable
Dim insertedStr As String
Dim insertPosition As Long
Dim positionStr As String
Dim cnt As Variant
On Error GoTo ErrorHandler
'---Beschreiben Sie den folgenden Prozess---
'◆◆◆ Wo Zeichen eingefügt werden sollen: Ändern Sie hier für jeden Verwendungszweck.
insertPosition = ProcessingPosition.Back
'◆◆◆◆◆
'Drücken Sie insertPosition in Zeichen aus
Select Case insertPosition
Case ProcessingPosition.Front
positionStr = "Vor dem Wert"
Case ProcessingPosition.Back
positionStr = "Hinter dem Wert"
Case Else
positionStr = "Sowohl vor als auch nach dem Wert"
End Select
'Geben Sie die Einfügezeichenfolge ein
insertedStr = InputBox("Bitte geben Sie die Zeichenfolge ein, die hier eingefügt werden soll." & _
vbNewLine & _
"Die aktuelle Einfügeposition ist [" & _
positionStr & _
"】 Ist.", "Geben Sie die einzufügende Zeichenfolge an", "")
'Fügen Sie eine Zeichenfolge in den Wert jeder Zelle ein
For Each cnt In Selection
Select Case insertPosition
Case ProcessingPosition.Front
cnt.Value = insertedStr & cnt.Value
Case ProcessingPosition.Back
cnt.Value = cnt.Value & insertedStr
Case Else
cnt.Value = insertedStr & cnt.Value & insertedStr
End Select
Next
ExitHandler:
Exit Sub
ErrorHandler:
MsgBox "Ein Fehler ist aufgetreten, also beenden Sie" & _
vbLf & _
"Funktionsname:" & FUNC_NAME & _
vbLf & _
"Fehlernummer" & Err.Number & Chr(13) & Err.Description, vbCritical
GoTo ExitHandler
End Sub