Reputation: 119
I have tried to write this little script that will batch rename file extensions. I am passing three arguments, the directory where the files are located, the current extension, and the new extension.
The error I am getting is
python batch_file_rename_2.py c:\craig .txt .html
Traceback (most recent call last):
File "batch_file_rename_2.py", line 13, in <module>
os.rename(filename, newfile)
WindowsError: [Error 2] The system cannot find the file specified
The code is
import os
import sys
work_dir=sys.argv[1]
old_ext=sys.argv[2]
new_ext=sys.argv[3]
files = os.listdir(work_dir)
for filename in files:
file_ext = os.path.splitext(filename)[1]
if old_ext == file_ext:
newfile = filename.replace(old_ext, new_ext)
os.rename(filename, newfile)
Upvotes: 1
Views: 154
Reputation: 10541
Problem is that os.listdir
returns only filenames without path, you should use function os.path.join
to join work_dir
and filename
.
And line newfile = filename.replace(old_ext, new_ext)
looks very unsafe because it can replace not only extension but some unexpected parts of filename.
You can replace file extension in more safe way using os.path
functions, splitext
for example.
Upvotes: 0
Reputation: 64563
You must specify fullname when you are not in the directory (you are not):
os.rename(os.path.join(work_dir, filename), os.path.join(work_dir, newfile))
Upvotes: 0
Reputation: 1121942
os.listdir
returns only the filenames, not complete paths. Use os.path.join
to recreate the correct path:
for filename in files:
file_ext = os.path.splitext(filename)[1]
if old_ext == file_ext:
newfile = filename.replace(old_ext, new_ext)
os.rename(
os.path.join(work_dir, filename),
os.path.join(work_dir, newfile))
Upvotes: 6