2013-07-09 18 views
2

我正在嘗試使用python重命名文件,但我無法確切地知道錯誤在哪裏,也許我太累了,因爲試圖這樣做超過30小時不停。os.renames的Python使用

的實際問題,當你在看所需的輸出,並在實際一個相當明顯的。

#!/usr/bin/env python 
import sys 
import os 
import glob 
if __name__ == '__main__': 
    input_file=sys.argv[1] 
    File= open(input_file) 
    while True: 
     line=File.readline() 
     words = line.split() 
     if not ("call" or "song") in words: 
     break 
     folder_dest= words[0] +" "+ words[1] 
     subfolder=words[3] 
     filename=words[4].replace(".wav","") 
     folder_now=words[7].replace(".wav","") 
     os.chdir(folder_now) 
     i=1 
     for files in glob.glob("*.wav"): 
      os.renames(files,"../"+folder_dest+"/"+subfolder+"/"+filename+"-"+'{:03}'.format(i)+".wav") 
      i+=1 
     os.chdir("..") 

更多的解釋:

我有這個輸入文件

Aegolius harrisii song 10009.wav Aegolius harrisii song 21.wav 
Aegolius harrisii song 483_Aegolius%20harrisii_F27_Itatira_28_IV_2004_Weber%20Girao.wav Aegolius harrisii song 22.wav 
Gnorimopsar chopi song 1000517.wav Gnorimopsar chopi song 825.wav 
Myiobius barbatus call Myiobius.sulphureipygius9402-1.wav Myiobius barbatus call 1146.wav 
Myiobius barbatus song 1001.wav Myiobius barbatus song 1147.wav 
Muscipipra vetula call 1000682.wav Muscipipra vetula call 1122.wav 

這是當前文件夾結構:

1 
├── parte_1.wav 
└── parte_2.wav 

2 
├── parte_1.wav 
├── parte_2.wav 
├── parte_3.wav 
├── parte_4.wav 
├── parte_5.wav 
└── parte_6.wav 

...

這裏是輸出爲現在:

Aegolius harrisii/ 
    ├── 100015.wav 
    │   ├── Aegolius-001.wav 
    │   └── Aegolius-002.wav 
    └── AEGOLI~1.wav 
     ├── Aegolius-001.wav 
     ├── Aegolius-002.wav 
     ├── Aegolius-003.wav 
     ├── Aegolius-004.wav 
     ├── Aegolius-005.wav 
     └── Aegolius-006.wav 

所需的輸出

Aegolius harrisii/ 
├── call 
│   ├── 100015-001.wav 
│   └── 100015-002.wav 
└── song 
    ├── AEGOLI~1-001.wav 
    ├── AEGOLI~1-002.wav 
    ├── AEGOLI~1-003.wav 
    ├── AEGOLI~1-004.wav 
    ├── AEGOLI~1-005.wav 
    └── AEGOLI~1-006.wav 

的問題是:什麼我'做錯了在os.renames?

謝謝你閱讀/回答這個!

+1

您輸入輸入文件的方式導致所有行一起運行。我已將其編輯爲我認爲您想要的內容,請驗證錯誤是否正確。 – abarnert

回答

1

的第一個問題是顯而易見的,如果你只是打印出words

['Aegolius', 'harrisii', 'song', '10009.wav', 'Aegolius', 'harrisii', 'song', '21.wav'] 

你設置subfolder=words[3],這是10009.wav而非song。你想要第三個詞,它是words[2](因爲Python是基於0的)。

同樣,您正在設置filename=words[4]而不是words[3],這是Aegolius而不是10009.wav

我認爲你有folder_now是正確的,它是21.wav。第二個問題是if not ("call" or "song") in words不能做你想做的。 ("call" or "song")只是"call"。所以,只要你達到與song一致的線路就停下來。

你可能想要這個:

if not ("call" in words or "song" in words): 

...也許:

if not {"call", "song"}.intersection(words): 

第三個可能的問題(我不知道這是否影響到你)就是你使用break而不是continue,這意味着您停在第一個無效行,而不是跳過無效行。


雖然我們在這,一些小的方式,你可以提高代碼:

  • 與你的縮進一致。您的源代碼混合了製表符和空格,這是災難的祕訣;你很幸運,你逃脫了。您還可以在任何地方使用不同數量的縮進 - 兩個空格,三個空格,四個空格,一個製表符等 - 這會使您的代碼難以閱讀。發現你自己的編輯器負責爲你服務(無論是IDLE,像Visual Studio或Eclipse這樣漂亮的IDE,一個漂亮的「程序員文本編輯器」,比如BBEdit,甚至emacs)。
  • 而不是做while True:line=File.readline(),你可以做for line in File:
  • 請勿嘗試os.chdir倒退。如果你在中間失敗或取消,你會讓事情處於一種怪異的狀態,你會遇到符號鏈接等問題。你可以使用路徑,如for files in glob.glob(os.path.join(folder_now, "*.wav"))
  • 使用os.path函數而不是試圖將路徑視爲字符串。
  • 不要試圖通過設置i=1和每次通過循環做i+=1來維持一個明確的計數器;只需使用enumerate即可。
  • 使用一致的命名約定。
+0

謝謝你的回答,特別是提高我的代碼的所有建議。 – Mansueli