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.
Pour résoudre le problème ci-dessus, j'ai pensé à l'automatisation avec Python.
Remarques ・ Python 3.6.6
Cela fonctionne selon le flux suivant.
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()
・ 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.
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/ |
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