Skip to content

Instantly share code, notes, and snippets.

@sqordfish
Created June 23, 2014 02:54
Show Gist options
  • Save sqordfish/8e749e79a80bcad369c5 to your computer and use it in GitHub Desktop.
Save sqordfish/8e749e79a80bcad369c5 to your computer and use it in GitHub Desktop.
Python script for organizing files in windows into multiple folders by file type. I made this primarily to organize my downloads folder.
#Author: Jacob Rust
#Date: 7/8/2013
#Description:This script organizes downloaded files into separate folders depending
#on the file type. This was made for windows systems.
#Download directory should be the first command line argument
#New file types can be added to the dictionary in the main method
import os
import sys
import hashlib
#Creates folders for different file types
def makeFolders(downloadDirectory, fileTypes):
for fileType in fileTypes.keys():
directory = downloadDirectory + "\\" + fileType
if not os.path.exists(directory):
os.mkdir(directory)
#Moves file to its proper folder and delete any duplicates
def moveFile(moveFile, downloadDirectory, fileTypes):
#The file format is what is after the period in the file name
if "." in moveFile:
temp = moveFile.split(".")
fileFormat = temp[-1]
else:
return
for fileType in fileTypes.keys():
if fileFormat in fileTypes[fileType]:
srcPath = downloadDirectory + "\\" + moveFile
dstPath = downloadDirectory + "\\" + fileType + "\\" + moveFile
#If the file doesn't have a duplicate in the new folder, move it
if not os.path.isfile(dstPath):
os.rename(srcPath, dstPath)
#If the file already exists with that name and has the same md5 sum
elif os.path.isfile(dstPath) and \
checkSum(srcPath) == checkSum(dstPath):
os.remove(srcPath)
print "removed " + srcPath
return
#Get md5 checksum of a file. Chunk size is how much of the file to read at a time.
def checkSum(fileDir, chunkSize = 8192):
md5 = hashlib.md5()
f = open(fileDir)
while True:
chunk = f.read(chunkSize)
#If the chunk is empty, reached end of file so stop
if not chunk:
break
md5.update(chunk)
f.close()
return md5.hexdigest()
def main():
#Dictionary contains file types as keys and lists of their corresponding file formats
fileTypes = {}
fileTypes["Images"] = ["jpg", "gif", "png", "jpeg", "bmp"]
fileTypes["Audio"] = ["mp3", "wav", "aiff", "flac", "aac"]
fileTypes["Video"] = ["m4v", "flv", "mpeg", "mov", "mpg", "mpe", "wmv", \
"MOV", "mp4"]
fileTypes["Documents"] = ["doc", "docx", "txt", "ppt", "pptx", "pdf", "rtf"]
fileTypes["Exe"] = ["exe"]
fileTypes["Compressed"] = ["zip", "tar", "7", "rar"]
fileTypes["Virtual_Machine_and_iso"] = ["vmdk", "ova", "iso"]
#The second command line argument is the download directory
downloadDirectory = sys.argv[1]
downloadFiles = os.listdir(downloadDirectory)
makeFolders(downloadDirectory, fileTypes)
for filename in downloadFiles:
moveFile(filename, downloadDirectory, fileTypes)
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment