[PYTHON] [201911 ~ 201912] Kürzlich erstellte verschiedene Programme und Tools usw.

Über diesen Artikel

Verschiedene Programme und Tools, die ich kürzlich für den persönlichen Gebrauch erstellt habe.

Da der Artikel lang ist, ist es möglicherweise besser, nur die Elemente zu überspringen, die Sie aus der Tabelle sehen möchten.
* Die neuesten Tools und der Quellcode werden auf GitHub veröffentlicht.

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

1.Python

1-1. Ein Programm, das alte oder alte oder benannte Ordner zusammen mit den Dateien direkt darunter in den Papierkorb legt.

Auslösen

Wenn Sie Ordner mit alten Namen nicht bewusst organisieren, werden sie für immer gespeichert. Ich wollte es abschneiden.

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

Kommentar

    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.

1-2. Ein Programm, das nur eine bestimmte Dateipfad-Zeichenfolge im Text in eine allgemeine Zeichenfolge ändert

Auslösen

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.

Quellcode

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

Kommentar

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.

1-3. Ein Programm, das nur eine bestimmte URL-Zeichenfolge im Text in eine allgemeine Zeichenfolge ändert

Auslösen

Fast das gleiche wie 1-2

Quellcode

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

Kommentar

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

1-4. Selbstgemachte Klasse: Vereinfachte Anzeige des tkinter-Meldungsfelds

Auslösen

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.

Quellcode

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)

Kommentar

    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.

wie benutzt man

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

1-5. Ein Programm, das Dateien in einem bestimmten Ordner in verschiedene Ordner kopiert.

Auslösen

Mit einem Smartphone aufgenommene Fotos usw. Ich wollte es sowohl auf die Bilder auf meinem PC als auch auf den G-Laufwerksordner verschieben.

Quellcode

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

Kommentar

    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.

1-6 Würfelwerkzeug, um zufällige Ganzzahlen ohne Verwendung eines Zufallsmoduls zu erhalten

Auslösen

Wenn Sie die Zeit im Nanosekundenbereich erhalten Ist es möglich, Zufallszahlen auf menschlicher Erfahrungsebene zu erhalten? Ich habe es gemacht.

Quellcode

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

Kommentar

2.Powershell

2-1. Skript, das nach einer bestimmten Anzahl von Sekunden in den Ruhezustand versetzt werden soll

Auslösen

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.

Quellcode

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

Kommentar

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.

2-2. Ein Skript, das WinMerge mit den beiden Ordnern startet, die Sie immer im Vergleich verwenden.

Auslösen

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.

Methode

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
}

Kommentar

Wenn Sie "wtmp" auf der Konsole ausführen Starten Sie WinMerge mit Dif_1 und Dif_2 im Vergleich.

3.ExcelVBA

3-1. Tools zum Formatieren des Excel-Buches

Auslösen

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.

Quellcode

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

3-2. Werkzeug zum Einfügen einer Zeichenfolge vor oder nach dem Wert aller Zellen im ausgewählten Bereich

Auslösen

Beim Erstellen eines Abschriftensatzes Zitat ">" einfügen und Zeilendekoration "(vor und nach Satz) ~" einfügen Ich wollte ein Werkzeug, das es einfach macht.

Quellcode

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

Recommended Posts

[201911 ~ 201912] Kürzlich erstellte verschiedene Programme und Tools usw.
Zusammenfassung der 2016 erstellten OSS-Tools und -Bibliotheken