Das Speichern der auf dem lokalen PC protokollierten Daten auf der SSD wurde ständig durchgeführt. Die Arbeit hatte die folgenden zwei Probleme.
Um das obige Problem zu lösen, habe ich überlegt, mit Python zu automatisieren.
Anmerkungen ・ Python 3.6.6
Es funktioniert nach folgendem Ablauf.
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()
・ 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.
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/ |
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