Python os.rename and os.walk together
Asked Answered
H

3

6

I just wrote a python script to get rid of some annoying suffixes in filenames,

here's my code:

import os

for root, dirs, files in os.walk("path"):

    for filename in files:

        if filename.endswith("[AnnoyingTag].mov"):

            os.rename(filename, filename[:-18]+'.mov')

but I got the error in the last line:

OSError: [Errno 2] No such file or directory

I am pretty sure that I have the right path because I can print out all filenames correctly.

...really have no idea why this can't work.

Thanks for your answers

Haemato answered 23/6, 2013 at 5:7 Comment(3)
list(os.walk("path"))Balderdash
Why don't you print the filename before calling rename? Try to debug.Dogear
I did and it prints out all the filenames correctly. I tried type(filename), and they all return strings.Haemato
S
8

You can replace

os.rename(filename, filename[:-18]+'.mov')

with

os.rename(root + os.sep + filename, root + os.sep + filename[:-18]+'.mov')
Selfknowledge answered 23/6, 2013 at 5:18 Comment(3)
Thanks!! It works. but may I ask further why the original code would work?Haemato
In os.rename function, you have to give the full path, otherwise it search the file in the directory where your script is invoked. I'm not very sure what 'why the original code would work' you meant.Selfknowledge
Oh I mean wouldn't. Thanks for the explanation, I learned a lotHaemato
U
13

The preferred way to join paths is to use os.path.join, change this line:

os.rename(filename, filename[:-18]+'.mov')

Replace it with this:

os.rename(os.path.join(root, filename), os.path.join(root, filename[:-18]+'.mov'))
Urissa answered 23/6, 2013 at 5:22 Comment(1)
Thanks!! It works. but may I ask further why the original code would work?Haemato
S
8

You can replace

os.rename(filename, filename[:-18]+'.mov')

with

os.rename(root + os.sep + filename, root + os.sep + filename[:-18]+'.mov')
Selfknowledge answered 23/6, 2013 at 5:18 Comment(3)
Thanks!! It works. but may I ask further why the original code would work?Haemato
In os.rename function, you have to give the full path, otherwise it search the file in the directory where your script is invoked. I'm not very sure what 'why the original code would work' you meant.Selfknowledge
Oh I mean wouldn't. Thanks for the explanation, I learned a lotHaemato
C
0

Fixed:

import os

for root, dirs, files in os.walk("path"):
    for filename in files:
        if filename.endswith("[AnnoyingTag].mov"):
            os.rename(root+'\\'+filename, root+'\\'+filename[:-18]+'.mov')

I think your problem is that the files you're renaming aren't in the current working directory.

Centrosphere answered 23/6, 2013 at 5:16 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.