hi all,
I got this code:
import os
def renamer(folder):
dirname = folder
files = os.listdir(folder)
os.chdir(folder)
for i in files:
os.rename(i, dirname + '_' + i)
renamer('abc')
it works if I give an example folder to the function. But it doesnt work in a for cycle like this:
for i in os.listdir('.'):
renamer(i)
i have tons of folders that contain video files like this: file-1.mp4, file-2.mp4, file-3.mp4, and I'd like the files renamed a way that the new filename would contain the parent directory's name included: abc_file-1.mp4
Could you please help me to fix this code?
Which Python version you are using. os.scandir is much faster than os.listdir.
If 'i' happens to be a file you can't use os.listdir on it.
See
os.walk
I use python 3.6, i modified the script, but it still doesnt work
import os
def renamer(*folder):
dirname = folder
files = os.listdir(folder)
os.chdir(folder)
for i in files:
os.rename(i, dirname + '_' + i)
for root, dirs, files in os.walk('.'):
dirs[:] = [d for d in dirs if not d[0] == '.']
renamer(dirs)
import os
from sys import argv
path = argv[1] # take the directory from the command line.
for root, dirs, files in os.walk(path):
for file in files:
dir = os.path.split(root)[-1]
os.rename(file, f"{dir}-{file}")
os.walk starts from the 'path' and for each directory from the three returns a tuple:
{the_current_directory,
a_list_of_all_directories_in_the_current_directory,
a_list_of_all_files_in_the_current_directory)
So, you just pass the path to the os.walk and for each iteration, you change the names of the 'files' from the tuple (root, dirs, files). 'files' is a list of all files in 'root', which is the current directory during the scan.
Your script makes hidden files from regular files:-) in current folder, and that
os.rename(file, f"{dir}-{file}")
is buggy, by the way it was a good idea to take the input folder as a command line argument.
mine is buggy still:
for root, folders, files in os.walk('test'):
for file in files:
folder = os.path.split(root)[1]
src = file
dst = folder + '_' + file
os.rename(src, dst)
it complains:
FileNotFoundError: [Errno 2] No such file or directory: 'file-1.mp4' -> 'def_file-1.mp4'
It's crazy, if I replace os.rename(scr, dst) with print(src, dst), it finds the files:-)
That is because the command line argument is '.' and as you may know the dot in the beginning of a file/dir name in *nix systems makes them hidden.
Change it like this:
import os
from sys import argv
path = os.path.abspath(argv[1])
for root, dirs, files in os.walk(path):
for file in files:
dir = os.path.split(root)[-1]
os.rename(file, f"{dir}-{file}")
This change should make it works:
for root, folders, files in os.walk('test'):
for file in files:
folder = os.path.split(root)[1]
file_name = f"{folder}_{file}"
src = os.path.join(root, file_name)
os.rename(src, dst)