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

ShadowRanger
  • 143,180
  • 12
  • 188
  • 271
Lin Ti-Wen
  • 239
  • 1
  • 4
  • 8

3 Answers3

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'))
Óscar López
  • 232,561
  • 37
  • 312
  • 386
8

You can replace

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

with

os.rename(root + os.sep + filename, root + os.sep + filename[:-18]+'.mov')
su-
  • 3,116
  • 3
  • 32
  • 42
  • Thanks!! It works. but may I ask further why the original code would work? – Lin Ti-Wen Jun 23 '13 at 05:42
  • 1
    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. – su- Jun 23 '13 at 06:11
  • Oh I mean wouldn't. Thanks for the explanation, I learned a lot – Lin Ti-Wen Jun 23 '13 at 16:58
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.