2015-11-19 45 views
1

我試圖創建一個shell腳本,將文件從一臺計算機(員工的舊計算機)複製到另一臺(員工的新計算機)。我已經到了可以複製文件的地步,這要感謝可愛的人在這裏,但是我遇到了一個問題 - 如果我從這個目錄有兩個文件:Python:複製文件時創建文件夾

C :\ Users \ specificuser \ Documents \測試文件夾 ....到這個目錄... C:\ Users \ specificuser \ Desktop ...我看到文件顯示在桌面上,但文件夾這些文件是(測試文件夾)中未創建。

這裏是我使用的複製功能:

#copy function 
def dir_copy(srcpath, dstpath): 
    #if the destination path doesn't exist, create it 
    if not os.path.exists(dstpath): 
     os.makedir(dstpath) 
    #tag each file to the source path to create the file path 
    for file in os.listdir(srcpath): 
     srcfile = os.path.join(srcpath, file) 
     dstfile = os.path.join(dstpath, file) 
     #if the source file path is a directory, copy the directory 
     if os.path.isdir(srcfile): 
      dir_copy(srcfile, dstfile) 
     else: #if the source file path is just a file, copy the file 
      shutil.copyfile(srcfile, dstfile) 

我知道我需要在目的地創建目錄,我只是不太清楚如何去做。

編輯:我發現我有一個類型(os.makedir而不是os.mkdir)。我測試了它,它創建了它應該的目錄。但是我希望它能從創建目錄的一層開始創建目錄。例如,在測試文件夾中有子測試文件夾。它創建了子測試文件夾,但不會創建測試文件夾,因爲測試文件夾不是dstpath的一部分。那有意義嗎?

+0

@PaulK。我已經把它作爲函數的第一件事了。但是,我認爲問題在於我的「目標」是桌面 - 我沒有將Desktop \ Test Folder指定爲目標,所以測試文件夾永遠不會被創建。 –

+0

我道歉,我沒有看到。所以問題是該副本不能遞歸地工作? –

+0

@ PaulK.I編輯了我原來的帖子,但真正的問題是,我希望它從我開始的地方上升一級。如果我將Documents \ Test文件夾中的所有內容都移動到桌面,我希望它也創建Desktop \ Test文件夾,即使技術上我沒有將目標指定爲Desktop \ Test Folder,但我指定了Desktop。 –

回答

2

你可能想看看shutil.copytree()。它執行您正在尋找的遞歸複製功能,包括目錄。因此,一個基本的遞歸複製,你可以只運行:

shutil.copytree(srcpath, dstpath) 

然而,來實現自己的複製源目錄到目標目錄的目標,在此過程中創造的目標目錄內的源目錄,你可以使用這樣的事情:

import os 
import shutil 

def dir_copy(srcpath, dstdir): 
    dirname = os.path.basename(srcpath) 
    dstpath = os.path.join(dstdir, dirname) 
    shutil.copytree(srcpath, dstpath) 

請注意,您必須srcpath不是在年底包含斜槓這個工作。此外,加入目標目錄和源目錄名稱的結果必須不存在,否則copytree將失敗。

+0

這工作完美。謝謝! –

+0

我得到「訪問被拒絕」 - 有沒有辦法使用提升的權限或什麼東西運行shutil?也許有用戶插入計算機管理員的用戶名和密碼? –

+0

@MasterModnar如果您使用管理員權限運行腳本,則不應該獲得拒絕訪問錯誤。不過,我真的不知道在Windows上編程python。如果您遇到寫入錯誤,則可以考慮更新目標文件夾的權限,而不是以管理員身份運行。你也可以'除了IOError',並且如果errno是13(權限被拒絕),可能使用不同的目標。 – MPlanchard

0
import shutil 
import os 

def dir_copy(srcpath, dstpath): 
    try: 
     shutil.copytree(srcpath, dstpath) 
    except shutil.Error as e: 
     print('Directory not copied. Error: %s' % e) 
    except OSError as e: 
     print('Directory not copied. Error: %s' % e) 


dir_copy('/home/sergey/test1', '/home/sergey/test2') 
0

這是文件複製的常見問題......你打算只複製文件夾的內容還是你想讓文件夾本身複製。複製實用程序通常有一個標誌,你也可以。我使用os.makedirs,以便還可以創建任何中間目錄。

#copy function 
def dir_copy(srcpath, dstpath, include_directory=False): 
    if include_directory: 
     dstpath = os.path.join(dstpath, os.path.basename(srcpath)) 
    os.makedirs(dstpath, exist_ok=True) 
    #tag each file to the source path to create the file path 
    for file in os.listdir(srcpath): 
     srcfile = os.path.join(srcpath, file) 
     dstfile = os.path.join(dstpath, file) 
     #if the source file path is a directory, copy the directory 
     if os.path.isdir(srcfile): 
      dir_copy(srcfile, dstfile) 
     else: #if the source file path is just a file, copy the file 
      shutil.copyfile(srcfile, dstfile) 
+0

'include_directory'爲函數做了什麼,爲什麼將它設置爲'False'?另外,你能向我解釋'exist_ok = True'嗎? –

+0

'include_directory'在複製文件之前更改算法以在目標中創建'srcpath'(「Temp Folder」)的基本名稱。 '操作系統。makedirs'並且會創建多個子目錄(假設dstpath是需要創建的「C:\ Users \ specificuser \ Desktop \ test1 \ copiedfiles」),並且如果目錄已經存在,則'exist_ok'不會引發錯誤(不需要爲os.path.exists測試)。在第一次調用時,設置'include_directory = True',但後來的遞歸調用不需要它。 – tdelaney

相關問題