I want to change a.txt
to b.kml
.
Use os.rename
:
import os
os.rename('a.txt', 'b.kml')
Usage:
os.rename('from.extension.whatever','to.another.extension')
File may be inside a directory, in that case specify the path:
import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)
As of Python 3.4 one can use the pathlib module to solve this.
If you happen to be on an older version, you can use the backported version found here
Let's assume you are not in the root path (just to add a bit of difficulty to it) you want to rename, and have to provide a full path, we can look at this:
some_path = 'a/b/c/the_file.extension'
So, you can take your path and create a Path
object out of it:
from pathlib import Path
p = Path(some_path)
Just to provide some information around this object we have now, we can extract things out of it. For example, if for whatever reason we want to rename the file by modifying the filename from the_file
to the_file_1
, then we can get the filename part:
name_without_extension = p.stem
And still hold the extension in hand as well:
ext = p.suffix
We can perform our modification with a simple string manipulation:
Python 3.6 and greater make use of f-strings!
new_file_name = f"{name_without_extension}_1"
Otherwise:
new_file_name = "{}_{}".format(name_without_extension, 1)
And now we can perform our rename by calling the rename
method on the path object we created and appending the ext
to complete the proper rename structure we want:
p.rename(Path(p.parent, new_file_name + ext))
More shortly to showcase its simplicity:
Python 3.6+:
from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, f"{p.stem}_1_{p.suffix}"))
Versions less than Python 3.6 use the string format method instead:
from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))
pathlib
library is introduced in python 3.4 so sharing the answer here also provides exposure for a solid module to showcase its versatility and usage for more complicated requirements.
{}
are for string formatting, which you can read about here. Ultimately, what is happening is that the {}
get replaced with the variables that are passed in to the format
method. So the first {}
will hold what is in name_without_extension
, and the second will hold the second argument which is simply 1
.
import shutil
shutil.move('a.txt', 'b.kml')
This will work to rename or move a file.
shutil.move
is not a good option due to not being an atomic operation. If the file is open, for instance, shutil.move
will create a file with new_name
, but will not delete the file with old_name
hence leaving you with two files. os.rename
on the other hand will do nothing, which is a better option. With shutil.move
, even if you caught the error, you would still have to worry about checking and deleting the rogue file. Just not worth it when a better tool exists: os.rename
.
pathlib
respectively Path
with renaming open - windows - files.
Use os.rename
. But you have to pass full path of both files to the function. If I have a file a.txt
on my desktop so I will do and also I have to give full of renamed file too.
os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')
As of Python version 3.3 and later, it is generally preferred to use os.replace
instead of os.rename
so FileExistsError
is not raised if the destination file already exists.
assert os.path.isfile('old.txt')
assert os.path.isfile('new.txt')
os.rename('old.txt', 'new.txt')
# Raises FileExistsError
os.replace('old.txt', 'new.txt')
# Does not raise exception
assert not os.path.isfile('old.txt')
assert os.path.isfile('new.txt')
See the documentation.
One important point to note here, we should check if any files exists with the new filename.
suppose if b.kml file exists then renaming other file with the same filename leads to deletion of existing b.kml.
import os
if not os.path.exists('b.kml'):
os.rename('a.txt','b.kml')
os.rename
in a try
/except
or os.replace
.
import os
# Set the path
path = 'a\\b\\c'
# save current working directory
saved_cwd = os.getcwd()
# change your cwd to the directory which contains files
os.chdir(path)
os.rename('a.txt', 'b.klm')
# moving back to the directory you were in
os.chdir(saved_cwd)
chdir()
to a directory, e.g. what happens under Windows when it is a UNC? And doing a chdir()
has side-effects. I would rather just specify the necessary paths to os.rename()
directly, no chdir()
ing.
Using the Pathlib library's Path.rename instead of os.rename:
import pathlib
original_path = pathlib.Path('a.txt')
new_path = original_path.rename('b.kml')
os.rename
with pathlib
objects.
Here is an example using pathlib
only without touching os
which changes the names of all files in a directory, based on a string replace
operation without using also string concatenation:
from pathlib import Path
path = Path('/talend/studio/plugins/org.talend.designer.components.bigdata_7.3.1.20200214_1052\components/tMongoDB44Connection')
for p in path.glob("tMongoDBConnection*"):
new_name = p.name.replace("tMongoDBConnection", "tMongoDB44Connection")
new_name = p.parent/new_name
p.rename(new_name)
import shutil
import os
files = os.listdir("./pics/")
for key in range(0, len(files)):
print files[key]
shutil.move("./pics/" + files[key],"./pics/img" + str(key) + ".jpeg")
This should do it. python 3+
print files[key]
and "python 3+" in the same answer?
If you are Using Windows and you want to rename your 1000s of files in a folder then: You can use the below code. (Python3)
import os
path = os.chdir(input("Enter the path of the Your Image Folder : ")) #Here put the path of your folder where your images are stored
image_name = input("Enter your Image name : ") #Here, enter the name you want your images to have
i = 0
for file in os.listdir(path):
new_file_name = image_name+"_" + str(i) + ".jpg" #here you can change the extention of your renmamed file.
os.rename(file,new_file_name)
i = i + 1
input("Renamed all Images!!")
os.chdir(r"D:\Folder1\Folder2") os.rename(src,dst) #src and dst should be inside Folder2
import os
import re
from pathlib import Path
for f in os.listdir(training_data_dir2):
for file in os.listdir( training_data_dir2 + '/' + f):
oldfile= Path(training_data_dir2 + '/' + f + '/' + file)
newfile = Path(training_data_dir2 + '/' + f + '/' + file[49:])
p=oldfile
p.rename(newfile)
os.path
with modern pathlib
is quite iffy. Go all the way with pathlib
instead.
You can use os.system to invoke terminal to accomplish the task:
os.system('mv oldfile newfile')
mv
is a unix builtin commandline program to move/rename a file.
Success story sharing
C:/folder/file.txt
on Windows or/home/file.txt
on Linux/MacOS).OSError
on Windows systems.os.path.exists
should be used to check if the target exists before renaming. This does create a "Time Of Check to Time Of Use" bug, but it's unlikely to cause issues. (I know of no easy way around this - see here.os.replace