重命名与子标签的子文件夹中的文件
问题描述:
目前,我有我的文件夹中的子文件夹38测试的子文件夹名称开始从到。每个子文件夹都有2个随机命名的wav文件,我想正确并顺序地重命名它。 例如: 子文件夹有wav文件我记录#1和我的记录#6,我希望他们改名为01_test_01和01_test_02所以最后一个文件夹应该有文件38_test_01和38_test_02重命名与子标签的子文件夹中的文件
下面是我的代码
import os
name = 'test'
rootdir = r'C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test'
for subdir, dirs, files in os.walk(rootdir):
for file in files:
filepath = subdir+os.sep +file
if filepath.endswith('.wav'):
split_dir = subdir.split(os.sep)
f_name, f_ext=(os.path.splitext(file))
new_1 = split_dir[8]
y=1
while y < 3 :
new_name= (new_1 +'_' + 'test_' + str(y).zfill(2) + f_ext)
y = y +1
print (filepath)
print (subdir+os.sep+new_name)
os.rename(filepath, subdir+os.sep+new_name)
但是在执行时os.rename我收到以下错误
Traceback (most recent call last):
File "C:\Users\kushal\Desktop\final_earthquake\sikkim_demo\demo_sikkim_victor\sort_inner_wav.py", line 23, in <module>
os.rename(filepath, subdir+os.sep+new_name)
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'C:\\Users\\kushal\\Desktop\\final_earthquake\\demonstration_sikkim\\wav\\test\\01\\My recording #5.wav' -> 'C:\\Users\\kushal\\Desktop\\final_earthquake\\demonstration_sikkim\\wav\\test\\01\\01_test_02.wav'
大多数LIKEY它试图重新命名相同的文件,而不是两次从子
输出一次重命名每个文件:
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\01\My recording #1.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\01\01_test_01.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\01\My recording #1.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\01\01_test_02.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\01\My recording #6.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\01\01_test_01.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\01\My recording #6.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\01\01_test_02.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\02\My recording #3.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\02\02_test_01.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\02\My recording #3.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\02\02_test_02.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\02\My recording #4.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\02\02_test_01.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\02\My recording #4.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\02\02_test_02.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\03\My recording #5.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\03\03_test_01.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\03\My recording #5.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\03\03_test_02.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\03\My recording #6.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\03\03_test_01.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\03\My recording #6.wav
C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test\03\03_test_02.wav
答
你有内部while
循环,导致问题,它会使用相同的filepath
多次,if
条件这样的替换:
import os
name = 'test'
rootdir = r'C:\Users\kushal\Desktop\final_earthquake\demonstration_sikkim\wav\test'
for subdir, dirs, files in os.walk(rootdir):
y=1
for file in files:
filepath = subdir+os.sep +file
if filepath.endswith('.wav'):
split_dir = subdir.split(os.sep)
print split_dir
f_name, f_ext=(os.path.splitext(file))
new_1 = split_dir[7]
new_name= (new_1 +'_' + 'test_' + str(y).zfill(2) + f_ext)
y+=1
if y>3:
break
print (filepath)
print (subdir+os.sep+new_name)
os.rename(filepath, subdir+os.sep+new_name)
答
你有两个for循环,这是可以理解的,但为什么有一个内部while循环?我想,你添加了while循环,因为你提到过,Each sub folder has 2 wav files
。
第二个for循环(for file in files:
)和inner while循环(while y < 3:
)实际上是导致错误。第二个for循环已经遍历所有的文件,所以,你不需要内部的while循环。
如下修改程序而不使用inner while循环。
import os
rootdir = './test'
for subdir, dirs, files in os.walk(rootdir):
y = 1
for file in files:
filepath = subdir + os.sep + file
if filepath.endswith('.wav'):
split_dir = subdir.split(os.sep)
f_name, f_ext = os.path.splitext(file)
new_name= split_dir[len(split_dir) - 1] +'_' + 'test_' + str(y).zfill(2) + f_ext
y = y + 1
print (filepath)
print (subdir + os.sep + new_name)
os.rename(filepath, subdir + os.sep + new_name)
它输出(在我的情况):
./test\01\yy.wav
./test\01\01_test_01.wav
./test\01\xx.wav
./test\01\01_test_02.wav
./test\02\yy.wav
./test\02\02_test_01.wav
./test\02\xx.wav
./test\02\02_test_02.wav
谢谢Tiny D. – choman
@choman实际上,如果所有的子文件夹只包含两个文件,你就不需要那个if语句。如果你想修改你的程序的方式,它处理所有子文件夹中的所有文件,那么你不需要'if'条件。我的解决方案会让你的程序更加灵活。 –
还有一件事,像'new_1 = split_dir [7]'这样的陈述是不灵活的,并不是实现你想要的东西的最好方法。你应该使用'new_1 = split_dir [len(split_dir) - 1]'。 –