[Python] J'ai créé un script qui coupe et colle automatiquement les fichiers du PC local sur un SSD externe.

Synopsis

Le travail de stockage des données enregistrées sur le PC local sur le SSD était constant. Le travail avait les deux problèmes suivants.

    1. Bien que le travail lui-même soit simple, il existe des règles détaillées et il est difficile pour quiconque autre que ceux qui connaissent les règles de travailler. Exemple de règle: -Utilisez la date comme nom de dossier lors du stockage des données sur le SSD. ・ Je ne veux pas laisser de données sur mon PC local, alors coupez et collez Même si vous connaissez les règles de la 2.1, le travail lui-même est gênant

Pour résoudre le problème ci-dessus, j'ai pensé à l'automatisation avec Python.

Remarques ・ Python 3.6.6

comportement

Cela fonctionne selon le flux suivant.

SSD自動化.PNG

La source

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:Sortie de la progression du mouvement du fichier sur la console

    if os.path.exists(despath):  #Si le dossier de destination existe déjà
        despath = despath + 'tmp'  #Définissez le nom du dossier de destination avec un autre nom pour le moment

    acfnum = 1  #Nombre de fichiers déjà copiés
    fflg = 1    #Drapeau indiquant lors de la copie du premier fichier

    time.sleep(2)

    while acfnum < fnum:  #Si tous les fichiers n'ont pas été copiés, le numéro de fichier en cours de copie sera affiché sur la console jusqu'à la fin de la copie.
        if len(os.listdir(despath)) > acfnum or fflg:  #Lorsque le nombre de fichiers copiés augmente
            print(str(fnum) + "Du dossier" + str(len(os.listdir(despath))) + "Copie du second ...")
            fflg = 0  #Sortie vers la console uniquement si vous copiez le premier fichier

        acfnum = len(os.listdir(despath))  #Mettre à jour le nombre de fichiers copiés
        time.sleep(0.2)


def move_files_with_folder(file_from, file_to):  # task2:Déplacer le fichier

    shutil.copytree(file_from, file_to)  #Copier un fichier
    shutil.rmtree(file_from)  #Supprimer le fichier source


def move_only_files(file_from_pc, file_from_ssd, file_to):  # task2:Déplacer le fichier

    files = os.listdir(file_from_pc)  #Mettre à jour la liste des fichiers à copier

    shutil.copytree(file_from_pc, file_from_ssd)  #Copiez le fichier une fois en tant que dossier tmp sur le SSD

    for i in range(len(files)):  #Déplacer les données dans le dossier tmp une par une
        if not os.path.exists(file_to + '/' + files[i]):  #S'il n'y a pas de fichier du même nom dans la destination

            shutil.move(file_from_ssd + '/' + files[i], file_to)  #Déplacer le fichier

        else:  #S'il y a un fichier du même nom dans la destination
            print('「' + files[i] + 'Est déjà stocké dans le dossier de destination du fichier.')
            break

    shutil.rmtree(file_from_ssd)  #Supprimer le fichier source
    shutil.rmtree(file_from_pc)   #Supprimer le fichier source de la copie


def get_ssd_path():  #Obtenez le chemin du SSD connecté au PC

    drv = ['D:/', 'E:/', 'F:/', 'G:/']
    ssd = ['SSD_1', 'SSD_2', 'SSD_3', 'SSD_4']  #Fichiers pour identifier SSD, etc.

    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/"  #Copier le chemin source
        dpath = get_ssd_path()                      #Copier le chemin de destination
        
        if dpath:  #Lorsque le SSD est connecté

            header = 'soft_'  #Chaîne de caractères autre que le numéro de version dans le nom de fichier

            files = os.listdir(opath)    #Liste des fichiers à copier
            filevers = [0] * len(files)  #initialisation du type de liste

            #Extraire uniquement le numéro de version du dossier cible de la copie
            for i in range(len(files)):

                #Exclut les dossiers autres que le groupe de dossiers cible
                if len(files[i]) >= len(header) + 4:

                    #Sauf pour ceux avec des alphabets dans le numéro de version
                    if not bool(re.search('[a-zA-Z_]+', files[i][len(header):len(header) + 4])):
                        #Stocke uniquement le numéro de version du dossier cible de la copie
                        filevers[i] = int(files[i][len(header):len(header) + 4])

            #Numéro de version le plus élevé(= Nouveau)Définir le dossier comme cible de copie
            ofilepath = opath + header + str(max(filevers)) + '/logging data'

            date = str(datetime.date.today()).replace('-', '')
            dfilepath = dpath + date  #Copier le paramètre de chemin de destination

            #Tâche de paramétrage multi-thread1:Sortie de la progression du déplacement du fichier dans la tâche de la console:Déplacer le fichier
            task1 = threading.Thread(target=disp_copying_file_num,  args=([len(os.listdir(ofilepath)), dfilepath]))

            if os.listdir(ofilepath):  #S'il y a des fichiers à déplacer
                if os.path.exists(dfilepath):  #Lorsqu'un fichier avec la date du jour existe dans la destination de la copie (= copie à partir de la deuxième fois aujourd'hui)

                    print('Dossier qui existe déjà "' + date + 'Déplacez les données vers.\n')

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

                else:  #Lorsque le fichier daté d'aujourd'hui n'existe pas dans la destination de la copie (= copie pour la première fois aujourd'hui)
                    print('dossier"' + date + 'Pour déplacer les données.\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')  #Déplacer vers SSD et restaurer les dossiers perdus
                print('\n Le déplacement du fichier est terminé.\n')

            else:
                print('Il n'y a aucun fichier à déplacer.\n')

        else:
            print('Le SSD n'est pas connecté à votre ordinateur.\n')

    except Exception as e:

        allerr = ''

        msg = traceback.format_exc()
        tmp = msg

        for i in range(msg.count('", line ')):  #Extraire l'emplacement où l'erreur s'est produite

            startnum = tmp.find('", line ', len('", line '), len(tmp))  # 'i'La première'line'Prêt à commencer là où il y a
            tmp = tmp[startnum:len(tmp)]  # 'i'La première'line'Extrait de à la fin
            errnum = tmp[len('", line '):tmp.find(', in ')]  # 'i'La première'Nombre de lignes où une erreur s'est produite'Extrait
            allerr = allerr + errnum  #Ajout du nombre de lignes où une erreur s'est produite

            if not i == (msg.count('", line ') - 1):  #Séparez le nombre de lignes d'erreur par une virgule
                allerr = allerr + ', '

        errtitle = str(type(e)).replace('class ', '')  #Résumé des erreurs
        errdtl = str(e.args).replace('("', '').replace('",)', '')  #Détails de l'erreur

        print('Une erreur est survenue. Veuillez contacter le développeur.\nTEL: 090-0000-0000\n')
        print('Où l'erreur s'est produite:' + allerr)
        print('Message d'erreur:' + errtitle + ' ' + errdtl)
        print('\n')

    os.system('PAUSE')  #Arrêtez la console à la fin du processus
    

if __name__ == "__main__":

    main()

Problème (résolu)

・ S'il y a plusieurs fichiers à déplacer, je veux savoir combien d'entre eux ont été copiés. → En utilisant le multi-thread, il correspond en déplaçant les fichiers d'un côté et en surveillant le dossier de destination de l'autre côté et en sortant le nombre de fichiers copiés sur la console.

・ Si vous ne parvenez pas à déplacer le fichier, vous craignez que les données que vous avez essayé de déplacer soient perdues. → À proprement parler, le déplacement du fichier était géré par la copie et la suppression du fichier d'origine. (Prenez en compte si le système de fichiers SSD de destination est FAT au lieu de NTFS)

・ Je souhaite pouvoir répondre immédiatement aux problèmes tels que les erreurs → L'ensemble est couvert par le traitement des exceptions try / except, et lorsqu'une erreur se produit, l'emplacement, le contenu et les coordonnées du développeur de l'erreur sont affichés sur la console.

Informations qui ont servi de référence

En particulier, j'étais redevable aux sites suivants. Merci beaucoup.

Contenu Lier la destination
Traitement parallèle (multi-thread) 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
Précautions lors de l'utilisation de tkinter dans d'autres threads https://qiita.com/shiracamus/items/cd1d5f2d8fabd4e8a366
Obtenez le numéro de ligne où l'erreur s'est produite https://uyaroom.com/try-except/

finalement

Merci à tous ceux qui ont fait des commentaires et des suggestions. Quant à cet article, si vous pouvez signaler des améliorations ou des erreurs, nous mouillerons l'oreiller et soupirerons de joie.

Recommended Posts

[Python] J'ai créé un script qui coupe et colle automatiquement les fichiers du PC local sur un SSD externe.
Un script python qui supprime les fichiers ._DS_Store et ._ * créés sur Mac
J'ai créé un script en python pour convertir des fichiers .md au format Scrapbox
J'ai créé un script POST pour créer un problème sur Github et l'enregistrer dans le projet
J'ai créé un système qui décide automatiquement de s'exécuter demain avec Python et l'ajoute à Google Agenda.
Création d'un toolver qui crache le système d'exploitation, Python, les modules et les versions d'outils à Markdown
Création d'une méthode pour sélectionner et visualiser automatiquement un graphique approprié pour les pandas DataFrame
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
La route pour installer Python et Flask sur un PC hors ligne
[Python] J'ai fait un décorateur qui ne semble pas avoir d'utilité.
J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
J'ai créé une application Web en Python qui convertit Markdown en HTML
[Python] Créez un linebot pour écrire le nom et l'âge sur l'image
Un script qui récupère les tweets avec Python, les enregistre dans un fichier externe et effectue une analyse morphologique.
J'ai créé une extension Chrome qui affiche un graphique sur la page Amedas
J'ai fait un script pour afficher des pictogrammes
[Python] J'ai créé un code de scraping web qui acquiert automatiquement le titre de l'actualité et l'URL de Nihon Keizai Shimbun.
J'ai créé un Line Bot qui utilise Python pour récupérer les e-mails non lus de Gmail!
[Python] J'ai créé un LINE Bot qui détecte les visages et effectue le traitement de la mosaïque.
J'ai fait un modèle de classification d'images et essayé de le déplacer sur mobile
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
Une histoire à laquelle j'étais accro après la communication SFTP avec python
Script Python qui explore le flux RSS du statut Azure et le publie sur Hipchat
J'ai créé un programme pour convertir des images en art ASCII avec Python et OpenCV
J'ai créé et publié une image Docker qui lit RSS et tweete automatiquement régulièrement.
[Python / C] J'ai créé un appareil qui fait défiler sans fil l'écran d'un PC à distance.
J'ai créé une VM qui exécute OpenCV pour Python
J'ai fait un script pour mettre un extrait dans README.md
J'ai créé un module Python pour traduire les commentaires
J'ai essayé de faire LINE BOT avec Python et Heroku
J'ai créé une bibliothèque python qui fait rouler le rang
Enregistrer des listes, des dictionnaires et des taples dans des fichiers externes python
Python: j'ai essayé menteur et honnête
Lors de l'écriture dans un fichier csv avec python, une histoire que j'ai fait une légère erreur et n'a pas respecté la date de livraison
J'ai créé un programme en Python qui change les données de 1 minute de FX en une heure arbitraire (1 heure, etc.)
J'ai créé un outil pour générer automatiquement un diagramme de transition d'état pouvant être utilisé à la fois pour le développement Web et le développement d'applications
"Arrêtez de soumettre des fichiers japonais à git sur Mac> <" Pour le moment, j'ai écrit un script pour rechercher des fichiers japonais incompatibles sur Mac et Linux.
J'ai créé un outil qui facilite un peu la création et l'installation d'une clé publique.
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
Une histoire qui a permis de créer automatiquement une liste de lecture Anison à partir de vos fichiers musicaux
J'ai essayé de créer un script qui retrace les tweets d'un utilisateur spécifique sur Twitter et enregistre l'image publiée à la fois
Un script Python qui enregistre une image de presse-papiers (GTK) dans un fichier.
J'ai créé un package pour filtrer les séries chronologiques avec python
Comment écrire une classe méta qui prend en charge à la fois python2 et python3
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
Un ensemble de fichiers de script qui font wordcloud avec Python3
Un script python qui convertit les données Oracle Database en csv
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python
J'ai fait un générateur de réseau neuronal qui fonctionne sur FPGA
J'ai fait un script pour dire bonjour à mon Koshien
J'ai créé un robot Line qui devine le sexe et l'âge d'une personne à partir de l'image
J'ai fait quelque chose avec python qui NOW LOADING se déplace de gauche à droite sur le terminal
J'ai créé un générateur brouillé qui encode vos phrases préférées de UTF-8 à Shift-JIS (cp932) en Python