2012-07-19 29 views
0

幫助!我正在編寫一個腳本,通過移動具有特定擴展名的文件來組織我的桌面。它似乎工作正常,但當我放鬆在我的桌面上發生了一件奇怪的事情。用Python移動文件錯誤

因此,我將所有文件複製到像'PDFs'和'IMAGES'一樣快速創建的文件夾中,但由於某些原因,當我運行腳本時,它不創建文件夾,而是創建文件並繼續將文件存儲在另一個文件中。

我需要讓這些傢伙回來,但我不知道該怎麼做。順便說一句,我正在使用Windows 7。以下是我的代碼。任何幫助,將不勝感激。

import shutil 
import os 

pwd = os.getcwd() 
working_path = 'C:\\Users\\grayson\\Desktop' 
wp = working_path 
folders = {'pdf':'PDFS','img':'IMAGES'} 

def main(): 
    create_folders(); 

    for d in os.walk(wp): 
     files = d[2] 
     break 
    print files 

    for filename in files: 
     order_file(filename) 


def create_folders(): 
    for fol in folders.keys(): 
     fol_name = folders[fol] 
     if not os.path.isdir(fol_name): 
      os.mkdir(fol_name) 

def order_file(fname): 
    split_name = fname.split('.') 
    exten = split_name[len(split_name)-1] 

    if exten == 'pdf': 
     shutil.move(wp + '\\' + fname, wp + '\\' + folders['pdf']) 
    elif exten == 'jpg' or exten == 'png' or exten == 'gif': 
     shutil.move(wp + '\\' + fname, wp + '\\' + folders['img']) 
    else: 
     print 'Sumin else' 

main() 
+1

讓我猜,你沒有從你的桌面目錄中運行這個?不幸的是,這個腳本造成的損害是不可逆的。你想要一個解釋你的腳本做錯了什麼的答案嗎? – jdi 2012-07-19 05:06:11

+0

'shutil.move(wp +'\\'+ fname,wp +'\\'+ folders ['pdf'])'如果您沒有從腳本運行腳本,此語句會將您的文件從文件名重命名爲PDFS桌面,併爲其他移動語句相同 – avasal 2012-07-19 05:19:48

回答

2

這是一個非常尷尬的腳本,用於將文件移動到已排序的目錄中。但是,我猜猜是哪裏出了問題。如果你沒有運行Desktop作爲你當前的工作目錄(這意味着當你運行腳本時你不在這個目錄中),那麼這些文件夾是在其他位置創建的。然後當你的文件開始移動時,目錄不存在,所以它只是將它們作爲新文件移動到彼此之上。

不幸的是,你不能扭轉這種傷害。你唯一的希望就是你有備份。

讓我更詳細地解釋腳本的某些部分...

pwd = os.getcwd() 
working_path = 'C:\\Users\\grayson\\Desktop' 

如果pwd是不一樣的working_path,還是會出問題的腳本。另外,即使在Windows中也應該使用正斜槓。它的有效和方便的路徑建設:working_path = 'C:/Users/grayson/Desktop'

您的文件夾創建部分:

# BEFORE 
def create_folders(): 
    for fol in folders.keys(): 
     fol_name = folders[fol] 
     if not os.path.isdir(fol_name): 
      os.mkdir(fol_name) 

你不確保目錄實際上是你的working_path變量下創建。你可以寫成這樣的:

# AFTER 
def create_folders(): 
    for fol_name in folders.itervalues(): 
     fol_path = os.path.join(working_path, fol_name) 
     if not os.path.isdir(fol_path): 
      os.mkdir(fol_path) 

那就在那裏可能會救你。它會在Desktop之下創建目錄,而不是從哪裏運行腳本。

# BEFORE 
split_name = fname.split('.') 
exten = split_name[len(split_name)-1] 

很多打字得到擴展名。通過添加斜線

# BEFORE 
if exten == 'pdf': 
    shutil.move(wp + '\\' + fname, wp + '\\' + folders['pdf']) 
elif exten == 'jpg' or exten == 'png' or exten == 'gif': 
    shutil.move(wp + '\\' + fname, wp + '\\' + folders['img']) 
else: 
    print 'Sumin else' 

您構建的路徑,只有建立在目標的目錄名稱:

# AFTER 
exten = fname.split('.')[-1] 

最後,部分地方移動了文件:您可以通過使這個容易。如果該目錄不存在,它將假定它是一個文件。您應該已將其構建到特定文件名:

# AFTER 
src = os.path.join(wp, fname) 
key = None 

if exten == 'pdf': 
    key = 'pdf' 
elif exten in ('jpg', 'png', 'gif'): 
    key = 'img' 

if key: 
    shutil.move(src, os.path.join(wp, folders['img'], fname)) 
else: 
    print 'Sumin else' 

這樣,如果目錄不存在,將肯定會失敗。

+0

啊。你是對的。我知道這個腳本很糟糕(大概在5分鐘內寫完了)。你是否有一般性的結構性建議可以使它不那麼「尷尬」。我不太瞭解Python。 – ballaw 2012-07-19 07:27:13

1

您沒有以安全的方式創建目錄。

人們可以猜測,但也許你有以前的嘗試稱爲PDFS等文件,並沒有創建目錄。因此,您將所有圖像一個接一個地重命名爲圖像......無法退回。

我希望你事先備份過。