My Download habit is notorious and my download folder end up piled up with random downloads, I created a python script to maintain my download folder in windows upon running the script it moves files with appropriate extension into its designated folder
.mp4 files will be moved to video folder
more extension and folder can be added by editing json file
import json
import os
import random
import shutil
download_folder_path = "C:\\Users\\<USER>\\Downloads"
with open("extensions.json",'r') as file:
data = json.load(file)
program_folder_name = f"{download_folder_path}\\{data[0]['windows_program_extensions']['folder_name']}"
compressed_folder_name = f"{download_folder_path}\\{data[0]['compressed_extensions']['folder_name']}"
image_folder_name = f"{download_folder_path}\\{data[0]['image_extensions']['folder_name']}"
video_folder_name = f"{download_folder_path}\\{data[0]['video_extensions']['folder_name']}"
documents_folder_name = f"{download_folder_path}\\{data[0]['document_extensions']['folder_name']}"
code_folder_name = f"{download_folder_path}\\{data[0]['code_extensions']['folder_name']}"
unknown_files = f"{download_folder_path}\\Unknown_Files"
folder_names = [program_folder_name,compressed_folder_name,image_folder_name,video_folder_name,documents_folder_name,code_folder_name,unknown_files]
file_names = []
for file in os.listdir(download_folder_path):
if os.path.isfile(os.path.join(download_folder_path,file)):
file_names.append(file)
for folder in folder_names:
if not os.path.exists(folder):
os.mkdir(folder)
print(f"{folder} has been created successfully")
else:
print("Folder is already there")
def handle_duplicate(file,destination_folder):
print("File already exists!!!")
print("Renaming...")
file_name,extension = os.path.splitext(file)
suffix = int(random.random()*10)
new_name = f"{file_name}-{suffix}{extension}"
os.rename(f"{download_folder_path}\\{file}",f"{download_folder_path}\\{new_name}")
shutil.move(f"{download_folder_path}\\{new_name}",destination_folder)
def file_mover(file,file_path,destination_folder):
print(destination_folder)
print(compressed_folder_name)
if not os.path.exists(os.path.join(destination_folder,file)):
shutil.move(file_path,destination_folder)
else:
handle_duplicate(file,destination_folder)
def main():
for file in file_names:
file_extension = os.path.splitext(file)[1]
file_path = f"{download_folder_path}\\{file}"
print(f"Moving... {file} in ")
if file_extension in data[0]['windows_program_extensions']['extensions']:
file_mover(file,file_path,program_folder_name)
elif file_extension in data[0]['compressed_extensions']['extensions']:
file_mover(file,file_path,compressed_folder_name)
elif file_extension in data[0]['image_extensions']['extensions']:
file_mover(file,file_path,image_folder_name)
elif file_extension in data[0]['video_extensions']['extensions']:
file_mover(file,file_path,video_folder_name)
elif file_extension in data[0]['document_extensions']['extensions']:
file_mover(file,file_path,documents_folder_name)
elif file_extension in data[0]['code_extensions']['extensions']:
file_mover(file,file_path,code_folder_name)
else:
file_mover(file,file_path,unknown_files)
Things im looking to do next
- Handling big file transfer,
- Usage of Python multithreading
- Scheduling script so it runs on given timeframe
- Improving coding style usage of mapping and different data structure and reduce the use of for loops
cron
exist for, so you don't have to reimplement that logic yourself. \$\endgroup\$