How can I rename the following files:
abc_2000.jpg abc_2001.jpg abc_2004.jpg abc_2007.jpg
into the following ones:
year_2000.jpg year_2001.jpg year_2004.jpg year_2007.jpg
The related code is:
import os
import glob
files = glob.glob('abc*.jpg')
for file in files:
os.rename(file, '{}.txt'.format(???))
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
import os
import glob
files = glob.glob('year*.jpg')
for file in files:
os.rename(file, 'year_{}'.format(file.split('_')[1]))
The one line can be broken to:
for file in files:
parts = file.split('_') #[abc, 2000.jpg]
new_name = 'year_{}'.format(parts[1]) #year_2000.jpg
os.rename(file, new_name)
Method 2
Because I have done something similar today:
#!/usr/bin/env python
import os
import sys
import re
if __name__ == "__main__":
_, indir = sys.argv
infiles = [f for f in os.listdir(indir) if os.path.isfile(os.path.join(indir, f))]
for infile in infiles:
outfile = re.sub(r'abc', r'year' , infile)
os.rename(os.path.join(indir, infile), os.path.join(indir, outfile))
Method 3
Here is my solution which is written with comments for each step so that even a newbie can understand and use, hack, and customize:
## THIS PYTHON FILE NEEDS TO BE RUN WITHIN THE IMAGES FOLDER WITH JPG/JPEG IMAGES WHOSE
## ..FILENAMES NEED RENAMED TO NUMERICAL SEQUENCE (1.jpg, 2.jpg, 3.jpg, 4.jpg... etc.)
## IMPORT MODULES
## IMPORT MODULES
## IMPORT MODULES
import re, glob, os, pathlib
## BEGIN DEFINE FUNCTIONS
## BEGIN DEFINE FUNCTIONS
## BEGIN DEFINE FUNCTIONS
def fn_RenameFiles(files, pattern, replacement):
## DECLARE VARIABLES
## SET COUNTER FOR LATER USE
i = 1
## BEGIN FOR LOOP
## BEGIN FOR LOOP
## BEGIN FOR LOOP
## FOR EACH PATHNAME IN
for pathname in glob.glob(files):
## PATHNAME
#print("pathname =", pathname) ## TEST OUTPUT
## BASENAME
basename = os.path.basename(pathname)
#print("basename =", basename) ## TEST OUTPUT
## IF PATHNAME EQUALS BASENAME...
if pathname == basename:
##...THEN TEST OUTPUT - THIS SHOULD ALWAYS PRINT TRUE
print("pathname == basename: TRUE")
print("pathname string =", pathname) ## STRING FILENAME IN DIRECTORY
print("basename string =", basename) ## STRING FILENAME IN DIRECTORY
## ELSE IF PATHNAME DOES NOT EQUAL BASENAME...
else:
##...THEN TEST OUTPUT
print("pathname == basename: FALSE")
print("pathname string =", pathname) ## STRING FILENAME IN DIRECTORY
print("basename string =", basename) ## STRING FILENAME IN DIRECTORY
## CALCULATE NEW FILENAME WITH REGULAR EXPRESSIONS
NewFilename = re.sub(pattern, replacement, basename)
## TEST OUTPUT
print("NewFilename =", NewFilename)
## IF NEWFILENAME DOES NOT EQUAL BASENAME...
if NewFilename != basename:
##...THEN RENAME THE PATHNAME WITH NEWFILENAME
os.rename(pathname, os.path.join(os.path.dirname(pathname), NewFilename))
## ELSE DOES THIS CONDTION EVER GET TRIGGERED?
else:
print("DOES THIS CONDITION EVER GET TRIGGERED?")
## END FOR LOOP
## END FOR LOOP
## END FOR LOOP
## TEST OUTPUT - LIST OF FILENAMES IN DIRECTORY
print("glob.glob(files) =", glob.glob(files))
## BEGIN FOR LOOP
## BEGIN FOR LOOP
## BEGIN FOR LOOP
## FOR EACH FILE IN glob.glob(files)
for each in glob.glob(files):
## FILE PATH TO DIRECTORY OF IMAGES
## FILE PATH OF CURRENT WORKING DIRECTORY WITH IMAGES = e.g. C:RootFolderimages
filepath = os.path.abspath('') ## = os.getcwd()
## TEST OUTPUT - FILE PATH OF CURRENT WORKING DIRECTORY
print("FILE PATH OF CURRENT WORKING DIRECTORY =", filepath)
## RENAME FILES IN CWD; JOIN EMPTY STRING FILEPATH + STRING OF INTEGER OF CURRENT COUNTER + STRING OF .JPG
os.rename(os.path.join(filepath, each), os.path.join(filepath, str(i)+'.jpg'))
## INCREASE COUNTER
i = i+1
## END FOR LOOP
## END FOR LOOP
## END FOR LOOP
## TEST OUTPUT - LIST OF FILENAMES IN DIRECTORY
print("glob.glob(files) =", glob.glob(files))
## TEST OUTPUT - GAME OVER
print("GAME OVER. GO CHECK YOUR IMAGE FOLDER")
## END DEFINE FUNCTIONS
## END DEFINE FUNCTIONS
## END DEFINE FUNCTIONS
### BEGIN MAIN PROGRAM
### BEGIN MAIN PROGRAM
### BEGIN MAIN PROGRAM
## CALL FUNCTION
fn_RenameFiles("*.jpg", r"^(.*).jpg$", r"new(1).jpg")
### END MAIN PROGRAM
### END MAIN PROGRAM
### END MAIN PROGRAM
## GAME OVER
## WE HOPE YOU ENJOYED AND THAT THIS HELPS YOUR UNDERSTANDING OF USING PYTHON LANGUAGE TO SOLVE PROBLEMS WITH PYTHON PROGRAMMING
## PLEASE COME BACK AGAIN SOON
## PLEASE VISIT OUR WEB SITES (OUR PROBLEM-SOLVING PROGRAMMING, CODING, & DEVELOPMENT SERVICES ARE AVAILABLE FOR HIRE):
## www.JerusalemProgrammer.com
## www.JerusalemProgrammers.com
## www.JerusalemProgramming.com
Method 4
# By changing one line in code i think this line will work or may be without changing anything this will work
import glob2
import os
def rename(f_path, new_name):
filelist = glob2.glob(f_path + "*.ma")
count = 0
for file in filelist:
print("File Count : ", count)
filename = os.path.split(file)
print(filename)
new_filename = f_path + new_name + str(count + 1) + ".ma"
os.rename(f_path+filename[1], new_filename)
print(new_filename)
count = count + 1
Call the function by passing two arguments f_path as your path and new_name as you like to give to file.
Method 5
This allows to rename the file with the creation date_time.
import os, datetime, time
folder = r"*:******TEST"
for file in os.listdir(folder):
date = os.path.getmtime(os.path.join(folder, file))
new_filename = datetime.datetime.fromtimestamp(date).strftime("%Y%m%d_%H%M%S.%f")[:-4]
os.rename(os.path.join(folder, file), os.path.join(folder, new_filename + ".pdf"))
print("Renamed " + file + " to " + new_filename)
time.sleep(0.1)
Method 6
import os
import glob
path = 'C:\Users\yannk\Desktop\HI'
file_num = 0
for filename in glob.glob(os.path.join(path, '*.jpg')):
os.rename(filename, path + '\' + str(file_num) + '.jpg')
file_num += 1
This is to rename all files in a folder to the indentation of their position in the folder you should be able to scrap this code up and use it for your purpose. THIS is for people who are on windows and therefore os.cwd or os.getcwd do not work
Method 7
check if any files exists with the new_name. if no file exists then continue renaming file.
for file in files:
parts = file.split('_') # Existing file name
new_name = 'year_{}'.format(parts[1]) #New file to be written
if not os.path.exists(new_name):
os.rename(file, new_name)
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0