2017-06-02 88 views
0

目前,我有我的文件夾中的子文件夾38測試子文件夾名稱開始從到。每個子文件夾都有2個隨機命名的wav文件,我想正確並順序地重命名它。 例如: 子文件夾有wav文件我記錄#1我的記錄#6,我希望他們改名爲01_test_0101_test_02所以最後一個文件夾應該有文件38_test_0138_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 

回答

0

你有內部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) 
+0

謝謝Tiny D. – choman

+1

@choman實際上,如果所有的子文件夾只包含兩個文件,你就不需要那個if語句。如果你想修改你的程序的方式,它處理所有子文件夾中的所有文件,那麼你不需要'if'條件。我的解決方案會讓你的程序更加靈活。 –

+0

還有一件事,像'new_1 = split_dir [7]'這樣的陳述是不靈活的,並不是實現你想要的東西的最好方法。你應該使用'new_1 = split_dir [len(split_dir) - 1]'。 –

1

你有兩個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 
相關問題