How to arrange pictures using Python in windows 10 or Linux
In this post, I’ll be discussing, how you can efficiently deal with large number of files and Organise them by their month and year and that too in some clicks after you learn to write the code.
Python code to arrange Pictures
Overview: I’ll be explaining a Python code that can efficiently manage pictures (or any files) in a specific directory. That you can specify. For example, your “C://Users//fred//Pictures//” contains 100’s of pictures from different times and you are not sure about when they are last modified and thus you can’t classify them into separate folders by their month/year. Thus you can run this utility code to manage those errors without thinking twice!
Python version I’ll be using:
Python 3.7.6 (default, Dec 19 2019, 23:50:13)
Other modules that are used in the code:
>>> import os
>>> import shutil
>>> from datetime import datetime
Overview of atime, mtime and ctime:
func_desc = os.open(file_path,os.O_RDONLY) # creating function description descrp = os.fstat(func_desc) # collecting all the file stats atime = timeStampToDate(descrp.st_atime) ctime = timeStampToDate(descrp.st_ctime) mtime = timeStampToDate(descrp.st_mtime) # collecting the modification time as 'timestamp'
so, in the above block of code, you open a file with os.open(file_path,O_RDONLY)
and collect and store all the stats of the file opened (here, stored in ‘descrp’). You can separately access them as shown. I have used atime,ctime and mtime
.
atime
– it is the access time, that means when you last accessed the file.
mtime
– it is the last modification time. This parameter signify the timestamp when the file contents were last modified.
ctime
– it is the ‘change time’. That is when the specific file’s permission was changed or renamed. This also changes the mtime
parameter of the file.
#note: All the values stored in atime, mtime and ctime are ‘timestamps’. So you need to convert it into a datetime object.
I have done this in a separate function and pass it with the timestamp and it will return the datetime object.
def timeStampToDate(timestamp): # getting the timestamp from main function date_obj = datetime.fromtimestamp(timestamp) # storing it as datetime object return date_obj # returning the same to the main function
Now to classify files into a folder concerning it’s modification time, we need to access the file’s mtime
parameter.
Now we’ll see how to get modification year, month, date, time separately.
yr = mtime.year # storing modification year mnth = mtime.month # storing modification month hour = mtime.hour # storing modification hour minute = mtime.minute # storing modification minute second = mtime.second # storing modification second mic_seconds = mtime.microsecond # storing modification modification File_time = list(map(str,[hour,minute,second])) # organising the file modification time in normal form
Creating Separate Folders And Moving Files Into Folders
Now to move files into separate folders, I have called a separate function, passing file path, filename, modification month and modification year to that function.
def create_folder(filepath_, filename, month, year): global store,cwd folder_name = str(month) + '_' + str(year) folder_path = cwd + folder_name + '/' if folder_name not in store: store.append(folder_name) # appending folder name os.mkdir(folder_path) # new folder created print(f'Folder: {folder_name} created.'.center(30, '_')) shutil.move(filepath_, folder_path + filename) # current file moved else: # if folder already exists shutil.move(filepath_, folder_path + filename) # current file move
Now if we sum up all the block of codes, this will look like:
import os,shutil,sys from datetime import datetime store = [] # global variable to store folder names already created cwd = '' # global variable to store current working directory def timeStampToDate(timestamp): # utility function to convert timestamp to datetime object date_obj = datetime.fromtimestamp(timestamp) return date_obj def folder_path_modify(folder_path): # modifies folder path allocation (making program open source) if sys.platform == 'linux': # for posix if folder_path.endswith('/'): return str(folder_path) else: return str(folder_path + '/') elif sys.platform == 'win32': # for windows if folder_path.endswith('\\') or folder_path.endswith('\\\\'): return str(folder_path) else: return str(folder_path + '\\') def create_folder(filepath, filename, month, year): # this function creates folder and moves files into them global store,cwd folder_name = str(month) + '_' + str(year) folder_path = cwd + folder_name if folder_name not in store: try: store.append(folder_name) # appending folder name folder_path = folder_path_modify(folder_path) os.mkdir(folder_path) # new folder created print(f'Folder: {folder_name} created.'.center(30, '_')) # dst_path = folder_path_modify(folder_path + filename) shutil.move(filepath, folder_path) # current file moved print(folder_path+filename) print('File moved !') except FileExistsError: pass else: # if folder already exists try: folder_path = folder_path_modify(folder_path) shutil.move(filepath, folder_path + filename) # current file moved print('File moved!') except FileExistsError: pass def input_folder(): # taking folder path input from the User test_folder = input('Enter Folder path where you want to test the code:') if os.path.exists(test_folder): test_folder = folder_path_modify(test_folder) return test_folder else: print('Invalid Path Entered, Try again!') test_folder = input_folder() return test_folder if __name__ == '__main__': folder = input_folder() os.chdir(folder) cwd = folder_path_modify(os.getcwd()) # storing the current working directory print(f'Current working Directory:{cwd}\n') for num,file in enumerate(os.listdir(cwd)): if os.path.isfile(file): print(num+1,'.',file) # printing number_of_files and file name file_path = cwd + file # initialising the file path func_desc = os.open(file_path,os.O_RDONLY) # creating function description descrp = os.fstat(func_desc) # collecting all the file stats # length = len(str(descrp)) # collecting the length of the object (for printing) # print(str(descrp).center(length+10,' ')) atime = timeStampToDate(descrp.st_atime) ctime = timeStampToDate(descrp.st_ctime) mtime = timeStampToDate(descrp.st_mtime) # collecting the modification time as 'timestamp' print(str(mtime.date().strftime('%d_%m_%y')).center(20)) # printing the date of modification yr = mtime.year # storing modification year mnth = mtime.month # storing modification month hour = mtime.hour # storing modification hour minute = mtime.minute # storing modification minute second = mtime.second # storing modification second mic_seconds = mtime.microsecond # storing modification modification File_time = list(map(str,[hour,minute,second])) # organising the file modification time in normal form print(f"{':'.join(File_time).center(20)}") # printing file time os.close(func_desc) # closing the opened file # creating folders according to month-yr classification and moving folders create_folder(file_path,file,mnth,yr)
I have written the folder_path_modify()
function to make this program open source, and this can be equally used in POSIX as well as the WINDOWS environment.
Also, I have used sys.platform
to find the OS you are working on!
The Input looks like this:
And the output will look like this:
#note: this is a part of the output, the full output is not possible to show!
File Manager View before Executing the code:
File Manager View before Executing the code:
I hope, you have got the idea and learn how we use Python to arrange pictures in windows 10 or Linux.
Also, read: Text watermark on an image in Python using PIL library
Leave a Reply