765

I want to change a.txt to b.kml.

1
  • Why not? import os os.rename(‘b.kml’) Commented Jul 2, 2024 at 22:25

17 Answers 17

1192

Use os.rename:

import os

os.rename('a.txt', 'b.kml')

Usage:

os.rename('from.extension.whatever','to.another.extension')
Sign up to request clarification or add additional context in comments.

8 Comments

Should be noted that if the files are not in the working directory you will need the full path.
not really, on 3.7 ubuntu, works for me using relative paths
@toing_toing of course it works, he probably just means that you should be aware of the current directory, and either specify the path relative to it, or just use the absolute path (like C:/folder/file.txt on Windows or /home/file.txt on Linux/MacOS).
It's worth noting that this will silently overwrite files on Unix-like systems but fail with 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.
If the user actually wants the file to be replaced on any operating system, one should use os.replace
|
165

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)

Comments

116

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)))

11 Comments

Why would you do this instead of the accepted answer? Seems far more complicated
Well @rbennell, most of this answer is an explanation. The answer is really just the three lines at the end. Furthermore, the accepted answer is made explicitly for that very name change. This answer provides a way to show how you can manipulate the filename to preserve parts that you want in the path or name of the file. Furthermore, the 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.
Thank you @idjaw, your comment is a good answer to a basic question of us beginners, a simple Why did you did that?. Also, it is refreshing to see non-hostile approach on internet to what is often considered as ignorant.
@SasukeUchiha - The {} 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.
In addition to the python docs. pyformat.info has lots of easy to read explanations and examples of all kinds of python string formatting
|
76
import shutil

shutil.move('a.txt', 'b.kml')

This will work to rename or move a file.

3 Comments

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.
@mvbentes it would be interesting to know the behaviour of pathlib respectively Path with renaming open - windows - files.
@mvbentes I'm not sure where your comment about shutil.move not removing old_name comes from. The docs states: If the destination is on the current filesystem, then os.rename() is used. Otherwise, src is copied to the destination using copy_function and then removed. In case of symlinks, a new symlink pointing to the target of src will be created as the destination and src will be removed. Everything points to src aka old_name being removed. It also seems that shutil.move uses os.rename internally...
23

os.rename(old, new)

This is found in the Python docs: http://docs.python.org/library/os.html

Comments

21

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.

Comments

14

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')

1 Comment

"Have to" isn't true. You can always substitute a relative file name for an absolute file name, and vice versa. What usually bites beginners is they don't understand how relative file names relate to the current working directory.
6

Use 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')

The primary benefit is that you don't have to construct the absolute output path — you can just pass the new filename. A secondary benefit is that it keeps things uniform if all your paths are all already Pathlib objects.

5 Comments

Why is this better?
It’s just easier to use this method if all your paths are already Pathlib objects.
You can already use os.rename with pathlib objects.
You don't need to import os if you stick to pathlib methods.
Why does it matter if we import os?
4

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')

1 Comment

This is vulnerable to race conditions. Prefer using either os.rename in a try/except or os.replace.
3
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)

2 Comments

Be wary of doing it this way. You cannot always 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.
Changing global state (the current working directory) is not necessary to rename files.
3

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)

Comments

1

How to change the first letter of filename in a directory:

import os
path = "/"

for file in os.listdir(path):
    os.rename(path + file, path + file.lower().capitalize())

then = os.listdir(path)
print(then)

1 Comment

Thanks. os.rename(path + file, path + file.replace(' ', '')) # remove spaces from in / out filename in python as notorious to deal with.
0
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+

2 Comments

... or use enumerate for a slightly more readable version : for key, fname in enumerate(files): …
How can you write print files[key] and "python 3+" in the same answer?
-1

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!!")

Comments

-2

os.chdir(r"D:\Folder1\Folder2")
os.rename(src,dst)
#src and dst should be inside Folder2

Comments

-4
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)

1 Comment

Hard-coding forward slash as the path separator and mixing old-style os.path with modern pathlib is quite iffy. Go all the way with pathlib instead.
-6

You can use os.system to invoke terminal to accomplish the task:

os.system('mv oldfile newfile')

2 Comments

yes, this will work only on a unix-based machine as mv is a unix builtin commandline program to move/rename a file.
Why would you invoke a terminal and define a UNIX only command when you can do it from python in a multi-platform way?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.