boysangur
boysangur

Reputation: 13

Renaming files in Python

I'm doing a Python course on Udacity. And there is a class called Rename Troubles, which presents the following incomplete code:

import os
def rename_files():
    file_list = os.listdir("C:\Users\Nick\Desktop\temp")
    print (file_list)

    for file_name in file_list:
        os.rename(file_name, file_name.translate(None, "0123456789"))

rename_files()

As the instructor explains it, this will return an error because Python is not attempting to rename files in the right folder. He then proceeds to check the "current working directory", and then goes on to specify to Python which directory to rename files in.

This makes no sense to me. We are using the for loop to specifically tell Python that we want to rename the contents of file_list, which we have just pointed to the directory we need, in rename_files(). So why does it not attempt to rename in that folder? Why do we still need to figure out cwd and then change it?? The code looks entirely logical without any of that.

Upvotes: 1

Views: 3275

Answers (4)

AChampion
AChampion

Reputation: 30258

Look into relative and absolute paths, listdir returns names relative to the path (in this case absolute path) provided to listdir. os.rename is then given this relative name and unless the app's current working directory (usually the directory you launched the app from) is the same as provided to listdir this will fail.

There are a couple of alternative ways of handling this, changing the current working directory:

os.chdir("C:\Users\Nick\Desktop\temp")
for file_name in os.listdir(os.getcwd()):
    os.rename(file_name, file_name.translate(None, "0123456789"))

Or use absolute paths:

directory = "C:\Users\Nick\Desktop\temp"
for file_name in os.listdir(directory):
    old_file_path = os.path.join(directory, file_name)
    new_file_path = os.path.join(directory, file_name.translate(None, "0123456789"))
    os.rename(old_file_path, new_file_path)

Upvotes: 1

Kenny
Kenny

Reputation: 675

I think your code needs some formatting help.

The basic issue is that os.listdir() returns names relative to the directory specified (in this case an absolute path). But your script can be running from any directory. Manipulate the file names passed to os.rename() to account for this.

Upvotes: 1

user1245262
user1245262

Reputation: 7505

You can get a file list from ANY existing directory - i.e.

os.listdir("C:\Users\Nick\Desktop\temp")

or

os.listdir("C:\Users\Nick\Desktop")

or

os.listdir("C:\Users\Nick")

etc.

The instance of the Python interpreter that you're using to run your code is being executed in a directory that is independent of any directory for which you're trying to get information. So, in order to rename the correct file, you need to specify the full path to that file (or the relative path from wherever you're running your Python interpreter).

Upvotes: 0

Jonathon Reinhart
Jonathon Reinhart

Reputation: 137398

Look closely at what os.listdir() gives you. It returns only a list of names, not full paths.

You'll then proceed to os.rename one of those names, which will be interpreted as a relative path, relative to whatever your current working directory is.

Instead of messing with the current working directory, you can os.path.join() the path that you're searching to the front of both arguments to os.rename().

Upvotes: 3

Related Questions