[PYTHON] [201911 ~ 201912] Programmes et outils divers récemment créés, etc.

À propos de cet article

Divers programmes et outils que j'ai récemment créés pour un usage personnel.

Étant donné que l'article est long, il peut être préférable de ne sauter que les éléments que vous souhaitez voir dans le tableau.
* Les derniers outils et code source sont publiés sur GitHub.

https://github.com/dede-20191130/CreateToolAndTest

1.Python

1-1. Un programme qui place des dossiers anciens, anciens ou nommés dans la corbeille avec les fichiers directement en dessous.

Déclencheur

Si vous n'organisez pas consciemment les dossiers avec des noms comme anciens, ils seront stockés pour toujours. Je voulais le couper.

code

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()

Commentaire

    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é.

1-2. Un programme qui change uniquement une chaîne de caractères de chemin de fichier spécifique dans le texte en une chaîne à usage général

Déclencheur

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.

Code source

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()

Commentaire

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.

1-3. Un programme qui ne modifie qu'une chaîne de caractères URL spécifique dans le texte en une chaîne à usage général

Déclencheur

Presque le même que 1-2

Code source

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()

Commentaire

        #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.

1-4. Classe personnelle: affichage simplifié de la boîte de message tkinter

Déclencheur

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.

Code source

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)

Commentaire

    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.

comment utiliser

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é.')

1 à 5. Un programme qui copie les fichiers d'un dossier spécifié dans différents dossiers.

Déclencheur

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.

Code source

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()

Commentaire

    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.

1-6. Outil de dés pour obtenir des entiers aléatoires sans utiliser de module aléatoire

Déclencheur

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.

Code source

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")

Commentaire

2.Powershell

2-1. Script pour mettre en veille prolongée après un nombre spécifié de secondes

Déclencheur

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é).

Code source

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

Commentaire

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.

2-2 Un script qui démarre WinMerge avec les deux dossiers que vous utilisez toujours comparés.

Déclencheur

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.

Méthode

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
}

Commentaire

Lorsque vous exécutez "wtmp" sur la console Démarrez WinMerge avec Dif_1 et Dif_2 comparés.

3.ExcelVBA

3-1. Outils de mise en forme du livre Excel

Déclencheur

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.

Code source

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

3-2. Outil pour insérer une chaîne avant ou après la valeur de toutes les cellules de la plage sélectionnée

Déclencheur

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.

Code source

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

Recommended Posts

[201911 ~ 201912] Programmes et outils divers récemment créés, etc.
Résumé des outils et bibliothèques OSS créés en 2016