Divers programmes et outils que j'ai récemment créés pour un usage personnel.
https://github.com/dede-20191130/CreateToolAndTest
1.Python
Si vous n'organisez pas consciemment les dossiers avec des noms comme anciens, ils seront stockés pour toujours. Je voulais le couper.
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("ancienne spécification du dossier de recherche de dossier", "Veuillez spécifier le chemin du dossier pour rechercher l'ancien dossier", initialvalue="")
if tmpPath not in (None, ''):
ThrowAwayOld(tmpPath)
def ThrowAwayOld(baseFolderPath):
"""Rechercher récursivement les anciens dossiers et envoyer leur contenu dans la corbeille"""
if not os.path.isdir(baseFolderPath):
messagebox.showerror("Erreur", "Un chemin de dossier qui n'existe pas.")
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', 'vieux', 'Vieux'):
send2trash.send2trash(os.path.abspath(f))
rmNum += 1
messagebox.showinfo("Réussite", "Le processus est terminé.\n" + str(rmNum) + "J'ai envoyé un ancien dossier à la poubelle.")
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', 'vieux', 'Vieux'):
send2trash.send2trash(os.path.abspath(f))
rmNum += 1
La recherche récursive de fichier est possible en définissant récursif dans la fonction glob.glob.
Envoyez un dossier contenant des mots tels que «ancien» et «ancien» dans la corbeille.
J'ai voulu mettre un coussin sous la forme de l'envoyer à la poubelle car il ne peut pas être restauré lorsqu'il est retiré.
Lors de la publication du code source sur SNS tel que Qiita Je ne voulais pas inclure mon chemin de fichier personnel ou mon nom de fichier. Par conséquent, j'ai créé un programme qui peut remplacer le chemin du fichier à la fois.
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:
#Détecter le code de caractère
with open(pp.absolute(), "rb") as f:
temp = chardet.detect(f.read())['encoding']
#Caractères d'entrée
allText = pp.read_text(encoding=temp)
# ///Remplacement par une expression régulière
#Remplacer le chemin du fichier
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)
#Remplacer le chemin du dossier
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)
#Sortie après remplacement
pp.write_text(allText, encoding=temp)
if __name__ == '__main__':
Main()
Utilisation des fonctions read_text / write_text et avec la syntaxe du module pathlib Simplifie l'entrée / sortie de fichier.
#Détecter le code de caractère
with open(pp.absolute(), "rb") as f:
temp = chardet.detect(f.read())['encoding']
#Caractères d'entrée
allText = pp.read_text(encoding=temp)
La chaîne de caractères entière est lue à l'aide du code de caractère détecté à l'avance.
# ///Remplacement par une expression régulière
#Remplacer le chemin du fichier
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)
#Remplacer le chemin du dossier
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)
Concernant le chemin du fichier
Le remplacement de l'expression régulière est utilisé sous la condition.
Concernant le chemin du dossier,
Le remplacement de l'expression régulière est utilisé sous la condition.
Presque le même que 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:
#Détecter le code de caractère
with open(pp.absolute(), "rb") as f:
temp = chardet.detect(f.read())['encoding']
#Caractères d'entrée
allText = pp.read_text(encoding=temp)
# print(allText)
#Remplacement par une expression régulière
allText = re.sub(r'"https?://.*"', r'"http://foobar.com"', allText)
allText = re.sub(r"'https?://.*'", r"'http://foobar.com'", allText)
#Sortie après remplacement
pp.write_text(allText, encoding=temp)
if __name__ == '__main__':
Main()
#Remplacement par une expression régulière
allText = re.sub(r'"https?://.*"', r'"http://foobar.com"', allText)
allText = re.sub(r"'https?://.*'", r"'http://foobar.com'", allText)
Il prend en charge les chaînes de caractères entre guillemets simples ou doubles.
L'affichage de la boîte de message de python est Étant donné que diverses préparations telles que la configuration du cadre racine Je voulais pouvoir afficher un message avec un seul appel à la méthode statique.
TkHandler_MsgBox_1.py
import tkinter as tk
from tkinter import messagebox
class TkHandler_MsgBox_1:
"""
Classe de gestion de boîte de message_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='message', content='ここにmessageが表示されます。'):
messagebox.showinfo(title, content)
def errorMsgBox(self, title='Erreur', content='Erreurが発生しました。'):
messagebox.showerror(title, content)
@staticmethod
def showStandardMessage(title, content, isError=False, errorTitle=None, errorContent=None):
"""
Utilisé lors de l'affichage d'un message en utilisation standard.
L'objet Tk sera libéré immédiatement sans le réutiliser.
:arg
(error)title:(Erreur)Titre
(error)content:(Erreur)Contenu du message
isError:Si une erreur se produit, un message d'erreur s'affiche.
"""
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
Ce qui précède est le gestionnaire de contexte lors de l'utilisation de la syntaxe with. Référence: https://python.keicode.com/lang/context-manager.php
Je ne ferai rien cette fois.
def normalMsgBox(self, title='message', content='ここにmessageが表示されます。'):
messagebox.showinfo(title, content)
def errorMsgBox(self, title='Erreur', content='Erreurが発生しました。'):
messagebox.showerror(title, content)
Lorsque chacun est appelé, un message s'affiche dans les conditions définies dans l'argument. Cette fois, seules les fonctions correspondant au message d'information et au message d'erreur sont implémentées.
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)
Branche conditionnellement les variables avec l'opérateur ternaire en fonction de la valeur de isError.
La fonction finale appeléeFunc sera normalMsgBox ou errorMsgBox.
Utilisez-le comme ça. Il peut être appelé sur une seule ligne sans avoir besoin de définir la trame racine.
from Commons.TkHandler_MsgBox_1 import TkHandler_MsgBox_1
TkHandler_MsgBox_1.showStandardMessage('Traitement terminé', 'Le déplacement du fichier est terminé.')
Photos prises avec un smartphone, etc. Je voulais le déplacer à la fois sur les images de mon PC et sur le dossier du lecteur G.
CopyPicsToFolders.py
import glob
import os
import sys
#Réinitialiser le chemin de recherche du module
#Rendre possible de démarrer en double-cliquant
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 = []
#Obtenez tous les fichiers image directement dans le dossier spécifié
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)
#Copier dans le dossier de destination de sortie spécifié
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('Traitement terminé', 'Le déplacement du fichier est terminé.')
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('Traitement terminé', 'Le déplacement du fichier est terminé.')
for file in glob.glob(mySrcPath + '\\*', recursive=False):
send2trash.send2trash(os.path.abspath(file))
Si vous n'attrapez pas l'exception Afficher un message en supposant qu'il s'agit d'un jugement normal, Envoyez les fichiers du dossier d'origine à la corbeille.
Si vous obtenez l'heure au niveau de la nanoseconde Est-il possible d'obtenir des nombres aléatoires au niveau de l'expérience humaine? Je l'ai fait.
DiceAppWithoutRandomLibrary.py
import time
import tkinter as tk
from tkinter import messagebox
def diceResult():
#Acquisition de variables aléatoires en fonction du temps (en temps d'expérience humaine)
temp = int((time.time_ns() % 100000000) / 100)
#Divisez le reste par 6
myTempRmd = temp % 6
if myTempRmd == 0:
myTempRmd = 6
return myTempRmd
if __name__ == '__main__':
#Obtenez des résultats de dés
result = diceResult()
#S'affiche sous forme de message après avoir lancé les dés
root = tk.Tk()
root.withdraw() #Ne montrez pas de petites fenêtres
messagebox.showinfo("Dé", "Le résultat est" + str(result) + "est")
2.Powershell
avant de dormir, Lorsque j'essaye de dormir après avoir transféré des fichiers sur le lecteur G Vous devez attendre la fin du transfert. J'ai créé un script pour le mettre en veille après un certain temps (une fois le transfert terminé).
hibernationTimer.ps1
Param(
[long]$waitTime = 300 #Temps (s) d'attente
)
sleep $waitTime
#Hiberner
shutdown -h
#Fermez uniquement la fenêtre de la console où ce script est exécuté (PID est une variable automatique qui définit l'ID de processus du PowerShell en cours d'exécution)
Stop-Process -Id $PID
Spécifiez le nombre de secondes spécifié dans l'argument (la valeur par défaut est 300 secondes) Exécutez sur la console.
Ferme automatiquement l'écran de la console lors de la mise en veille prolongée.
Si vous pouvez commencer par les dossiers que vous comparez toujours (anciens et nouveaux dossiers de projet, etc.) comparés Créé en pensant qu'il n'est pas nécessaire de le spécifier à chaque fois sur l'écran de spécification du dossier.
Ajoutez ce qui suit au fichier de profil Powershell.
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
}
Lorsque vous exécutez "wtmp" sur la console Démarrez WinMerge avec Dif_1 et Dif_2 comparés.
3.ExcelVBA
Lors de la remise du livre Excel à l'autre partie La feuille est la feuille la plus à gauche, Certaines personnes se plaignent que le curseur ne pointe pas vers la cellule A1.
Un outil pour empêcher ces personnes de dire quoi que ce soit.
outil
'******************************************************************************************
'*Nom de la fonction: formatForSubmission
'*Fonction: vous pouvez le faire rapidement lorsque vous devez organiser l'apparence lors de la soumission du livre Excel à l'autre partie.
'Déplacez les curseurs de toutes les feuilles vers la cellule supérieure gauche (cellule A1) et activez la feuille la plus à gauche.
'*argument(1):Aucun
'******************************************************************************************
Public Sub formatForSubmission()
'constant
Const FUNC_NAME As String = "formatForSubmission"
'variable
Dim cntObj As Object 'Compteur de boucles
On Error GoTo ErrorHandler
'---Décrivez le processus ci-dessous---
'Déplacez le curseur de toutes les feuilles vers la cellule supérieure gauche (cellule A1)
For Each cntObj In Worksheets
'Ignorer les cellules masquées
If cntObj.Visible = True Then
cntObj.Select
cntObj.Range("A1").Select
End If
Next
'Sélectionnez la feuille visible numérotée la plus basse
For Each cntObj In Worksheets
If cntObj.Visible = True Then
cntObj.Select
Exit For
End If
Next
ExitHandler:
Exit Sub
ErrorHandler:
MsgBox "Une erreur s'est produite, alors quittez" & _
vbLf & _
"Nom de la fonction:" & FUNC_NAME & _
vbLf & _
"Numéro d'erreur" & Err.Number & Chr(13) & Err.Description, vbCritical
GoTo ExitHandler
End Sub
Lors de la création d'une phrase de démarque Insérez le guillemet ">" et insérez la décoration de ligne "(avant et après la phrase) ~" Je voulais un outil qui faciliterait les choses.
outil
'Pour un objet ou une valeur particulière
'Représente la position pour effectuer le traitement des fonctions
Public Enum ProcessingPosition
Front = 1
Back = 2
Both = 3
End Enum
'******************************************************************************************
'*Nom de la fonction: insertStrToSelection
'*Fonction: insère une chaîne de caractères à la position spécifiée de la valeur de toutes les cellules de la plage sélectionnée.
'*Position désignée: avant / arrière ou à la fois avant et arrière
'*argument(1):Aucun
'******************************************************************************************
Public Sub insertStrToSelection()
'constant
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
'---Décrivez le processus ci-dessous---
'◆◆◆ Où insérer les caractères: modifiez ici pour chaque utilisation.
insertPosition = ProcessingPosition.Back
'◆◆◆◆◆
'Insertion express Position en caractères
Select Case insertPosition
Case ProcessingPosition.Front
positionStr = "Avant la valeur"
Case ProcessingPosition.Back
positionStr = "Derrière la valeur"
Case Else
positionStr = "Avant et après la valeur"
End Select
'Entrez la chaîne d'insertion
insertedStr = InputBox("Veuillez saisir la chaîne de caractères à insérer ici." & _
vbNewLine & _
"La position d'insertion actuelle est [" & _
positionStr & _
"】est.", "Spécifiez la chaîne de caractères à insérer", "")
'Insérez une chaîne dans la valeur de chaque cellule
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 "Une erreur s'est produite, alors quittez" & _
vbLf & _
"Nom de la fonction:" & FUNC_NAME & _
vbLf & _
"Numéro d'erreur" & Err.Number & Chr(13) & Err.Description, vbCritical
GoTo ExitHandler
End Sub