I've been teaching myself Python for a little while now, and I've never programmed before. I just wrote a basic backup program that writes out the progress of each individual file while it is copying. I wrote a function that determines buffer size so that smaller files are copied with a smaller buffer, and bigger files are copied with a bigger buffer. The way I have the code set up now doesn't seem very efficient, as there is an if loop that then leads to another if loops, creating four options, and they all just call the same function with different parameters.
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')
Is there a better way to accomplish what I'm doing? Sorry if the code is commented poorly or hard to follow. I didn't want to ask someone to read through all 120 lines of my poorly written code, so I just isolated the two functions. Thanks for any help.