I have a piece of code i wrote for school:
import ossource = "/home/pi/lab"
dest = os.environ["HOME"]for file in os.listdir(source):if file.endswith(".c")shutil.move(file,dest+"/c")elif file.endswith(".cpp")shutil.move(file,dest+"/cpp")elif file.endswith(".sh")shutil.move(file,dest+"/sh")
what this code is doing is looking for files in a source directory and then if a certain extension is found the file is moved to that directory. This part works. If the file already exists in the destination folder of the same name add 1
at end of the file name, and before the extension and if they are multiples copies do "1++".
Like this: test1.c
,test2.c
, test3.c
I tried using os.isfile(filename)
but this only looks at the source directory. and I get a true or false.
To test if the file exists in the destination folder you should os.path.join
the dest
folder with the file name
import os
import shutil
source = "/home/pi/lab"
dest = os.environ["HOME"] # Avoid using the reserved word 'file' for a variable - renamed it to 'filename' instead
for filename in os.listdir(source): # os.path.splitext does exactly what its name suggests - split the name and extension of the file including the '.'name, extension = os.path.splitext(filename) if extension == ".c": dest_filename = os.path.join(dest, filename) if not os.path.isfile(dest_filename): # We copy the file as isshutil.copy(os.path.join(source, filename) , dest) else: # We rename the file with a number in the name incrementing the number until we find one that is not used. # This should be moved to a separate function to avoid code duplication when handling the different file extensions i = 0 dest_filename = os.path.join(dest, "%s%d%s" % (name, i, extension)) while os.path.isfile(dest_filename): i += 1 dest_filename = os.path.join(dest, "%s%d%s" % (name, i, extension))shutil.copy(os.path.join(source, filename), dest_filename) elif extension == ".cpp"...# Handle other extensions
If you want to have put the renaming logic in a separate function using glob
and re
this is one way:
import glob
import re
...
def rename_file(source_filename, source_ext): filename_pattern = os.path.join(dest, "%s[0-9]*%s" % (source_filename, source_ext)) # Contains file such as 'a1.c', 'a2.c', etc...existing_files = glob.glob(filename_pattern)regex = re.compile("%s([0-9]*)%s" % (source_filename, source_ext)) # Retrieve the max of the index used for this file using regexmax_index = max([int(match.group(1)) for match in map(regex.search, existing_files)if match]) source_full_path = os.path.join(source, "%s%s" % (source_filename, source_ext)) # Rebuild the destination filename with the max index + 1 dest_full_path = os.path.join(dest, "%s%d%s" % (source_filename, (max_index + 1), source_ext)) shutil.copy(source_full_path, dest_full_path)...# If the file already exists i.e. replace the while loop in the else statementrename_file(name, extension)