2011-11-16 161 views
4

雖然Python對我來說很新,但我一直在嘗試學習基礎知識,以幫助我在地質學的研究。將子目錄中的特定文件移動到一個目錄 - python

反正我有幾個文件,一旦我從他們的zip文件中提取(痛苦緩慢的過程順便說一句),產生數百個子目錄,每個子目錄有2-3個文件。現在我想要做的是提取所有以'dem.tif'結尾的文件,並將它們放在一個單獨的文件中(移動而不是複製)。

我可能試圖跳到這裏的深處,但我寫的代碼運行時沒有錯誤,所以它不能找到文件(它確實存在!),因爲它給了我else語句。這裏是我創建的代碼

import os 

src = 'O:\DATA\ASTER GDEM\Original\North America\UTM Zone 14\USA\Extracted' # input 
dst = 'O:\DATA\ASTER GDEM\Original\North America\UTM Zone 14\USA\Analyses' # desired  location 

def move(): 
    for (dirpath, dirs, files) in os.walk(src): 
     if files.endswith('dem.tif'): 
      shutil.move(os.path.join(src,files),dst) 
      print ('Moving ', + files, + ' to ', + dst) 
     else: 
      print 'No Such File Exists' 

任何幫助將不勝感激,我提前感謝您的時間。

真誠,

比約恩

回答

5

首先,歡迎來到社區,和python!你可能想要改變你的用戶名,特別是如果你經常來這裏。 :)

我建議如下(從Mr. Beazley被盜):

# genfind.py 
# 
# A function that generates files that match a given filename pattern 

import os 
import shutil 
import fnmatch 

def gen_find(filepat,top): 
    for path, dirlist, filelist in os.walk(top): 
     for name in fnmatch.filter(filelist,filepat): 
      yield os.path.join(path,name) 

# Example use 

if __name__ == '__main__': 
    src = 'O:\DATA\ASTER GDEM\Original\North America\UTM Zone 14\USA\Extracted' # input 
    dst = 'O:\DATA\ASTER GDEM\Original\North America\UTM Zone 14\USA\Analyses' # desired  location 

    filesToMove = gen_find("*dem.tif",src) 
    for name in filesToMove: 
     shutil.move(name, dst) 
3

更新:提問澄清低於他/她實際上是調用移動功能,這是我回答的第一個點。

還有其他一些事情要考慮:

  • 你得從os.walk錯誤的每個元組返回元素的順序,我怕 - 檢查documentation for that function
  • 假設你已經修復了,也記住,你需要遍歷files,你需要os.join每個那些root,而不是src
  • 上面會很明顯,希望,如果你打印取出由os.walk返回的值並註釋掉該循環中的其餘代碼。
  • 對於執行潛在破壞性操作(如移動文件)的代碼,我總是會先嚐試一些代碼,只是將參數打印到shutil.move,直到您確定它是正確的。
+0

嗨馬克,感謝您的回覆。對不起,我的英文可能不是最好的,我的意思是說,我正在shell窗口中運行程序,方法是輸入move(),並且沒有shutil就可以正常運行。移動語句,但只要我添加它,我得到以下錯誤AttributeError:'列表'對象沒有屬性'endswith' – BJEBN

+0

@ user1041814:該錯誤是因爲我提到的第一和第二點 - 上述'文件'實際上步行中每個目錄中的子目錄列表。 –

+0

再次感謝您的建議!它有時總是最簡單的錯誤,如獲取os.walk函數的順序,讓你! – BJEBN

2

我想你已經混淆了你應該使用的方式os.walk()

for dirpath, dirs, files in os.walk(src): 
    print dirpath 
    print dirs 
    print files 
    for filename in files: 
     if filename.endswith('dem.tif'): 
      shutil.move(...) 
     else: 
      ... 
1

任何特別的原因,你需要做的是在Python?簡單的shell命令會不會更簡單?如果您使用的是類Unix系統,或者有權訪問Windows上的Cygwin:

find src_dir -name "*dem.tif" -exec mv {} dst_dir 
相關問題