[Python] Ich habe ein Skript erstellt, das Dateien auf dem lokalen PC automatisch ausschneidet und auf eine externe SSD einfügt.

Zusammenfassung

Das Speichern der auf dem lokalen PC protokollierten Daten auf der SSD wurde ständig durchgeführt. Die Arbeit hatte die folgenden zwei Probleme.

    1. Während die Arbeit selbst einfach ist, gibt es detaillierte Regeln und es ist für andere als diejenigen, die die Regeln kennen, schwierig zu arbeiten. Regelbeispiel:

Um das obige Problem zu lösen, habe ich überlegt, mit Python zu automatisieren.

Anmerkungen ・ Python 3.6.6

Verhalten

Es funktioniert nach folgendem Ablauf.

SSD自動化.PNG

Quelle

extract_data_to_SSD.py


import os
import re
import sys
import time
import shutil
import datetime
import threading
import traceback


def disp_copying_file_num(fnum, despath):  # task1:Geben Sie den Fortschritt der Dateiverschiebung an die Konsole aus

    if os.path.exists(despath):  #Wenn der Zielordner bereits vorhanden ist
        despath = despath + 'tmp'  #Stellen Sie den Namen des Zielordners vorerst mit einem anderen Namen ein

    acfnum = 1  #Anzahl der bereits kopierten Dateien
    fflg = 1    #Flag, das beim Kopieren der ersten Datei anzeigt

    time.sleep(2)

    while acfnum < fnum:  #Wenn nicht alle Dateien kopiert wurden, wird die zu kopierende Dateinummer bis zum Ende des Kopiervorgangs an die Konsole ausgegeben.
        if len(os.listdir(despath)) > acfnum or fflg:  #Wenn die Anzahl der zu kopierenden Dateien zunimmt
            print(str(fnum) + "Von der Datei" + str(len(os.listdir(despath))) + "Kopieren der zweiten ...")
            fflg = 0  #Ausgabe an die Konsole nur, wenn die erste Datei kopiert wird

        acfnum = len(os.listdir(despath))  #Aktualisieren Sie die Anzahl der zu kopierenden Dateien
        time.sleep(0.2)


def move_files_with_folder(file_from, file_to):  # task2:Datei bewegen

    shutil.copytree(file_from, file_to)  #Datei kopieren
    shutil.rmtree(file_from)  #Löschen Sie die Quelldatei


def move_only_files(file_from_pc, file_from_ssd, file_to):  # task2:Datei bewegen

    files = os.listdir(file_from_pc)  #Aktualisieren Sie die Liste der zu kopierenden Dateien

    shutil.copytree(file_from_pc, file_from_ssd)  #Kopieren Sie die Datei einmal als tmp-Ordner auf die SSD

    for i in range(len(files)):  #Verschieben Sie die Daten nacheinander in den tmp-Ordner
        if not os.path.exists(file_to + '/' + files[i]):  #Wenn das Ziel keine Datei mit demselben Namen enthält

            shutil.move(file_from_ssd + '/' + files[i], file_to)  #Datei bewegen

        else:  #Wenn sich im Ziel eine Datei mit demselben Namen befindet
            print('「' + files[i] + 'Ist bereits im Dateizielordner gespeichert.')
            break

    shutil.rmtree(file_from_ssd)  #Löschen Sie die Quelldatei
    shutil.rmtree(file_from_pc)   #Löschen Sie die Kopierquelldatei


def get_ssd_path():  #Holen Sie sich den Pfad der SSD mit dem PC verbunden

    drv = ['D:/', 'E:/', 'F:/', 'G:/']
    ssd = ['SSD_1', 'SSD_2', 'SSD_3', 'SSD_4']  #Dateien zur Identifizierung von SSD usw.

    for i in range(len(ssd)):
        for j in range(len(drv)):
            if os.path.exists(drv[j] + ssd[i]):
                return drv[j]
    return 0


def main():

    try:
        opath = "C:/Users/○○/Desktop/"  #Quellpfad kopieren
        dpath = get_ssd_path()                      #Zielpfad kopieren
        
        if dpath:  #Wenn SSD angeschlossen ist

            header = 'soft_'  #Andere Zeichenfolge als die Versionsnummer im Dateinamen

            files = os.listdir(opath)    #Liste der zu kopierenden Dateien
            filevers = [0] * len(files)  #Initialisierung des Listentyps

            #Extrahieren Sie nur die Versionsnummer des Kopierzielordners
            for i in range(len(files)):

                #Schließt andere Ordner als die Zielordnergruppe aus
                if len(files[i]) >= len(header) + 4:

                    #Außer denen mit Alphabeten in der Versionsnummer
                    if not bool(re.search('[a-zA-Z_]+', files[i][len(header):len(header) + 4])):
                        #Speichert nur die Versionsnummer des Kopierzielordners
                        filevers[i] = int(files[i][len(header):len(header) + 4])

            #Höchste Versionsnummer(= Neu)Ordner als Kopierziel festlegen
            ofilepath = opath + header + str(max(filevers)) + '/logging data'

            date = str(datetime.date.today()).replace('-', '')
            dfilepath = dpath + date  #Zielpfadeinstellung kopieren

            #Multithread-Einstellungsaufgabe1:Geben Sie den Fortschritt der Dateiverschiebung an die Konsolenaufgabe2 aus:Datei bewegen
            task1 = threading.Thread(target=disp_copying_file_num,  args=([len(os.listdir(ofilepath)), dfilepath]))

            if os.listdir(ofilepath):  #Wenn Dateien verschoben werden müssen
                if os.path.exists(dfilepath):  #Wenn eine Datei mit dem heutigen Datum im Kopierziel vorhanden ist (= Kopie ab dem zweiten Mal heute)

                    print('Ordner, der bereits existiert "' + date + 'Verschieben Sie die Daten nach.\n')

                    task2 = threading.Thread(target=move_only_files, args=([ofilepath, dfilepath + 'tmp', dfilepath]))
                    task1.start()
                    task2.start()

                else:  #Wenn die heute datierte Datei nicht im Kopierziel vorhanden ist (= heute zum ersten Mal kopieren)
                    print('Ordner"' + date + 'Daten verschieben.\n')
                    task2 = threading.Thread(target=move_files_with_folder, args=([ofilepath, dfilepath]))
                    task1.start()
                    task2.start()

                task1.join()
                task2.join()

                time.sleep(2)

                os.mkdir(opath + header + str(max(filevers)) + '/logging data')  #Wechseln Sie zu SSD und stellen Sie verlorene Ordner wieder her
                print('\n Die Dateiverschiebung ist abgeschlossen.\n')

            else:
                print('Es sind keine Dateien zu verschieben.\n')

        else:
            print('SSD ist nicht mit Ihrem Computer verbunden.\n')

    except Exception as e:

        allerr = ''

        msg = traceback.format_exc()
        tmp = msg

        for i in range(msg.count('", line ')):  #Extrahieren Sie den Ort, an dem der Fehler aufgetreten ist

            startnum = tmp.find('", line ', len('", line '), len(tmp))  # 'i'Der Erste'line'Stellen Sie ein, um dort zu beginnen, wo es ist
            tmp = tmp[startnum:len(tmp)]  # 'i'Der Erste'line'Auszug von bis zum Ende
            errnum = tmp[len('", line '):tmp.find(', in ')]  # 'i'Der Erste'Anzahl der Zeilen, in denen ein Fehler aufgetreten ist'Extrakt
            allerr = allerr + errnum  #Die Anzahl der Zeilen hinzugefügt, in denen ein Fehler aufgetreten ist

            if not i == (msg.count('", line ') - 1):  #Trennen Sie die Anzahl der Fehlerzeilen durch ein Komma
                allerr = allerr + ', '

        errtitle = str(type(e)).replace('class ', '')  #Fehlerübersicht
        errdtl = str(e.args).replace('("', '').replace('",)', '')  #Fehlerdetails

        print('Ein Fehler ist aufgetreten. Bitte kontaktieren Sie den Entwickler.\nTEL: 090-0000-0000\n')
        print('Wo der Fehler aufgetreten ist:' + allerr)
        print('Fehlermeldung:' + errtitle + ' ' + errdtl)
        print('\n')

    os.system('PAUSE')  #Stoppen Sie die Konsole am Ende des Vorgangs
    

if __name__ == "__main__":

    main()

Problem (gelöst)

・ Wenn mehrere Dateien verschoben werden müssen, möchte ich wissen, wie viele davon kopiert wurden. → Bei Verwendung von Multithread werden Dateien auf der einen Seite verschoben, der Zielordner auf der anderen Seite überwacht und die Anzahl der Dateien ausgegeben, die auf die Konsole kopiert werden.

・ Wenn Sie die Datei nicht verschieben können, besteht die Gefahr, dass die Daten, die Sie verschieben möchten, verloren gehen. → Genau genommen wurde das Verschieben der Datei durch Kopieren und Löschen der Originaldatei behandelt. (Berücksichtigen Sie, ob das Ziel-SSD-Dateisystem FAT anstelle von NTFS ist.)

・ Ich möchte sofort auf Probleme wie Fehler reagieren können → Das Ganze wird durch die Ausnahmebehandlung von try / exception abgedeckt. Wenn ein Fehler auftritt, werden Speicherort, Inhalt und Kontaktinformationen des Entwicklers des Fehlers an die Konsole ausgegeben.

Informationen, die als Referenz verwendet wurden

Insbesondere war ich den folgenden Seiten verpflichtet. Vielen Dank.

Inhalt Linkziel
Parallelverarbeitung (Multithread) https://qiita.com/init/items/74b36eba31ccbc0364ed#%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89
Vorsichtsmaßnahmen bei der Verwendung von tkinter in anderen Threads https://qiita.com/shiracamus/items/cd1d5f2d8fabd4e8a366
Rufen Sie die Zeilennummer ab, in der der Fehler aufgetreten ist https://uyaroom.com/try-except/

Schließlich

Vielen Dank an alle, die Kommentare und Vorschläge gemacht haben. Wenn Sie in diesem Artikel auf Verbesserungen oder Fehler hinweisen können, befeuchten wir das Kissen und seufzen vor Freude.

Recommended Posts

[Python] Ich habe ein Skript erstellt, das Dateien auf dem lokalen PC automatisch ausschneidet und auf eine externe SSD einfügt.
Ein Python-Skript, das auf dem Mac erstellte ._DS_Store- und ._ * -Dateien löscht
Ich habe ein Skript in Python erstellt, um MDD-Dateien in das Scrapbox-Format zu konvertieren
Ich habe ein POST-Skript erstellt, um ein Problem in Github zu erstellen und es im Projekt zu registrieren
Ich habe ein System erstellt, das automatisch entscheidet, ob es morgen mit Python ausgeführt wird, und es zu Google Kalender hinzufügt.
Erstellt einen Toolsver, der Betriebssystem, Python, Module und Toolversionen an Markdown ausspuckt
Erstellt eine Methode zur automatischen Auswahl und Visualisierung eines geeigneten Diagramms für Pandas DataFrame
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
Der Weg zur Installation von Python und Flask auf einem Offline-PC
[Python] Ich habe einen Dekorateur gemacht, der keinen Nutzen zu haben scheint.
Ich habe ein Tool zum automatischen Durchsuchen mehrerer Websites mit Selenium (Python) erstellt.
Ich habe eine Webanwendung in Python erstellt, die Markdown in HTML konvertiert
[Python] Erstellen Sie einen Linebot, um den Namen und das Alter auf das Bild zu schreiben
Ein Skript, das Tweets mit Python abruft, sie in einer externen Datei speichert und morphologische Analysen durchführt.
Ich habe eine Chrome-Erweiterung erstellt, die ein Diagramm auf der Amedas-Seite anzeigt
Ich habe ein Skript erstellt, um Piktogramme anzuzeigen
[Python] Ich habe einen Web-Scraping-Code erstellt, der automatisch den Nachrichtentitel und die URL von Nihon Keizai Shimbun erfasst.
Ich habe einen Zeilenbot erstellt, der Python verwendet, um ungelesene E-Mails aus Google Mail abzurufen!
[Python] Ich habe einen LINE-Bot erstellt, der Gesichter erkennt und Mosaikverarbeitungen durchführt.
Ich habe ein Bildklassifizierungsmodell erstellt und versucht, es auf dem Handy zu verschieben
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Python-Skript, das das Azure-Status-RSS crawlt und an Hipchat sendet
Ich habe ein Programm erstellt, um Bilder mit Python und OpenCV in ASCII-Grafik umzuwandeln
Ich habe ein Docker-Image erstellt, das RSS liest und automatisch regelmäßig twittert, und es veröffentlicht.
[Python / C] Ich habe versucht, ein Gerät zu erstellen, das den Bildschirm eines PCs drahtlos aus der Ferne scrollt.
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
Ich habe ein Skript erstellt, um ein Snippet in README.md einzufügen
Ich habe ein Python-Modul erstellt, um Kommentare zu übersetzen
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Ich habe eine Python-Bibliothek erstellt, die einen rollierenden Rang hat
Speichern Sie Listen, Wörterbücher und Tabellen in externen Python-Dateien
Python: Ich habe es mit Lügner und Ehrlichkeit versucht
Beim Schreiben in eine CSV-Datei mit Python habe ich einen kleinen Fehler gemacht und den Liefertermin nicht eingehalten
Ich habe in Python ein Programm erstellt, das die 1-Minuten-Daten von FX auf eine beliebige Zeit (1 Stunde usw.) ändert.
Ich habe ein Tool erstellt, um automatisch ein Zustandsübergangsdiagramm zu generieren, das sowohl für die Webentwicklung als auch für die Anwendungsentwicklung verwendet werden kann
"Stoppen Sie das Festschreiben japanischer Dateien für Git auf Mac> <" Vorerst habe ich ein Skript geschrieben, um nach inkompatiblen japanischen Dateien unter Mac und Linux zu suchen.
Ich habe ein Tool erstellt, mit dem das Erstellen und Installieren eines öffentlichen Schlüssels etwas einfacher ist.
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
Eine Geschichte, die es ermöglichte, automatisch eine Anison-Wiedergabeliste aus Ihren Musikdateien zu erstellen
Ich habe versucht, ein Skript zu erstellen, das die Tweets eines bestimmten Benutzers auf Twitter verfolgt und das veröffentlichte Bild sofort speichert
Ein Python-Skript, das ein GTK-Bild (Clipboard) in einer Datei speichert.
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
So schreiben Sie eine Meta-Klasse, die sowohl Python2 als auch Python3 unterstützt
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Eine Reihe von Skriptdateien, die Wordcloud mit Python3 ausführen
Ein Python-Skript, das Oracle-Datenbankdaten in CSV konvertiert
Ich habe Chatbot mit LINE Messaging API und Python erstellt
Ich habe einen neuronalen Netzwerkgenerator erstellt, der auf FPGA läuft
Ich habe ein Drehbuch gemacht, um bei meinem Koshien Hallo zu sagen
Ich habe einen Linienbot erstellt, der das Geschlecht und das Alter einer Person anhand des Bildes errät
Ich habe etwas mit Python gemacht, das sich JETZT LADEN auf dem Terminal von links nach rechts bewegt
Ich habe einen verstümmelten Generator erstellt, der Ihre Lieblingssätze von UTF-8 bis Shift-JIS (cp932) in Python codiert