Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Series Organizer - Steinar Lima #
- # #
- # Change path to your designatedroot folder, and let the script move files from the root #
- # to mathcing folders in the root folder. #
- import os
- import shutil
- # Obtains filenames and folder names
- def getFolderFileNames(path):
- folderList = list()
- fileList = list()
- for root, dirs, files in os.walk(path):
- if root == path:
- for i in range(len(dirs)):
- nameSplit = dirs[i].replace('.', ' ').lower()
- nameSplit = nameSplit.split(' ')
- folderName = dirs[i]
- folderPath = os.path.join(path, folderName)
- folderList.append((folderPath, nameSplit, folderName))
- for i in range(len(files)):
- nameSplit = files[i].replace('.', ' ').lower()
- nameSplit = nameSplit.split(' ')
- fileName = files[i]
- filePath = os.path.join(path, fileName)
- fileList.append((filePath, nameSplit, fileName))
- break
- return folderList, fileList
- # Check wether if the folder words are contained in the file string
- def checkWords(folderList, fileList, seriesFolder):
- def getSubFolder(folder, filee, seriesFolder):
- if seriesFolder == False:
- return ''
- else:
- seriesNo = re.findall('[sS][0-9][0-9]?', filee[2])
- if seriesNo:
- return folder[2] + ' ' + seriesNo[0].upper()
- else:
- return ''
- moveFileList = list()
- for folder in folderList:
- for filee in fileList:
- if fileEqFolder(folder, filee):
- subFolder = getSubFolder(folder, filee, seriesFolder)
- folderRelPath = os.path.join(folder[2], subFolder)
- folderPath = os.path.join(folder[0], subFolder)
- fileName = filee[2]
- oldPath = filee[0]
- newPath = os.path.join(folder[0], subFolder, fileName)
- moveFileList.append((oldPath, newPath, fileName, folderRelPath, folderPath))
- return moveFileList
- def fileEqFolder(folder, filee):
- for word in folder[1]:
- if word not in filee[1]:
- return 0
- return 1
- # Confirms the move, and ask additional question if the file already is on target folder
- def confirmMove(moveFileList):
- print 'Found {0} suitable file(s) for moving:'.format(len(moveFileList))
- print ''
- for index, mFile in enumerate(moveFileList):
- print '{0}: \'{1}\' -> \'{2}\''.format(index, mFile[2], mFile[3] + '\\')
- print ''
- for index, mFile in enumerate(moveFileList):
- txtStr = 'Move {0}? (yes\\no) '.format(index)
- move = raw_input(txtStr)
- if move == 'yes':
- if os.path.isfile(mFile[1]):
- print '\tFile already excists!'
- cont = raw_input('\tProceed (the old file will be overwritten)? (yes\\no) ')
- if cont != 'yes':
- moveFileList[index] = (None, None)
- else:
- moveFileList[index] = (None, None)
- # Move the confirmed files to the chosen folder
- def moveFiles(moveFileList):
- print 'Moving files...'
- for mFile in moveFileList:
- oldPath = mFile[0]
- newPath = mFile[1]
- print '\tMoving:\t{0}\n\tto\n\t{1}'.format(oldPath, newPath)
- if os.path.isdir(mFile[4]) == False:
- os.makedirs(mFile[4])
- try:
- shutil.move(oldPath, newPath)
- except shutil.Error:
- print 'Path not writeable, please change permissions on target folder'
- except WindowsError:
- print 'File is probably beeing used by another program'
- else:
- print '\tFile moved, OK!'
- print ''
- try:
- f = open('log.txt', 'a')
- except IOError:
- print 'Cannot open log file for writing'
- else:
- f.write('{0} moved to {1}\n'.format(oldPath, newPath))
- f.close()
- print '-------------------------------------------------------------------'
- print ''
- def runProgram(path, seriesFolder):
- folderList, fileList = getFolderFileNames(path)
- moveFileList = checkWords(folderList, fileList, seriesFolder)
- if len(moveFileList):
- confirmMove(moveFileList)
- moveFileList = filter(lambda a: a != (None, None), moveFileList)
- if len(moveFileList):
- moveFiles(moveFileList)
- print len(moveFileList), 'files moved from ', path
- else:
- print '0 files moved from ', path
- else:
- print '0 files moved from ', path
- # Main script
- paths = ['F:\Series']
- seriesFolders = True
- moveConf = True
- overwriteConf = True
- for path in paths:
- runProgram(path, seriesFolders)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement