Ich unterrichte Python seit einiger Zeit und habe es noch nie programmiert. Ich habe gerade ein einfaches Backup-Programm geschrieben, das den Fortschritt jeder einzelnen Datei während des Kopierens ausgibt. Ich habe eine Funktion geschrieben, die die Puffergröße bestimmt, so dass kleinere Dateien mit einem kleineren Puffer kopiert werden und größere Dateien mit einem größeren Puffer kopiert werden. Die Art und Weise, wie ich den Code eingerichtet habe, scheint nicht sehr effizient zu sein, da es eine if-Schleife gibt, die zu einer anderen if-Schleife führt, die vier Optionen erzeugt und alle dieselbe Funktion mit unterschiedlichen Parametern aufrufen.Gibt es eine bessere Möglichkeit, verschiedene Parameter mit if-Anweisungen in eine Funktion einzugeben?
import os
import sys
def smartcopy(filestocopy, dest_path, show_progress = False):
"""Determines what buffer size to use with copy()
Setting show_progress to True calls back display_progress()"""
#filestocopy is a list of dictionaries for the files needed to be copied
#dictionaries are used as the fullpath, st_mtime, and size are needed
if len(filestocopy.keys()) == 0:
return None
#Determines average file size for which buffer to use
average_size = 0
for key in filestocopy.keys():
average_size += int(filestocopy[key]['size'])
average_size = average_size/len(filestocopy.keys())
#Smaller buffer for smaller files
if average_size < 1024*10000: #Buffer sizes determined by informal tests on my laptop
if show_progress:
for key in filestocopy.keys():
#dest_path+key is the destination path, as the key is the relative path
#and the dest_path is the top level folder
copy(filestocopy[key]['fullpath'], dest_path+key,
callback = lambda pos, total: display_progress(pos, total, key))
else:
for key in filestocopy.keys():
copy(filestocopy[key]['fullpath'], dest_path+key, callback = None)
#Bigger buffer for bigger files
else:
if show_progress:
for key in filestocopy.keys():
copy(filestocopy[key]['fullpath'], dest_path+key, 1024*2600,
callback = lambda pos, total: display_progress(pos, total, key))
else:
for key in filestocopy.keys():
copy(filestocopy[key]['fullpath'], dest_path+key, 1024*2600)
def display_progress(pos, total, filename):
percent = round(float(pos)/float(total)*100,2)
if percent <= 100:
sys.stdout.write(filename + ' - ' + str(percent)+'% \r')
else:
percent = 100
sys.stdout.write(filename + ' - Completed \n')
Gibt es einen besseren Weg, um das zu erreichen, was ich tue? Entschuldigung, wenn der Code schlecht oder schwer zu verstehen ist. Ich wollte niemanden bitten, alle 120 Zeilen meines schlecht geschriebenen Codes durchzulesen, also habe ich einfach die beiden Funktionen isoliert. Danke für jede Hilfe.
Keine Notwendigkeit für ein Listenverständnis hier. Ein einfacher Generator (d. H. Ohne das '[]') würde genauso gut funktionieren :) +1 sowieso – Wolph
Oh, cool! Bearbeitet. Vielen Dank! –