2009-07-09 110 views
8

我對在python下移動的文件感到困惑。 在窗口的命令行,如果我有目錄C:\ a和一個目錄C:\ B,I可以做在python下移動文件

move c:\a c:\b 

而移動a到b的結果是目錄結構C:\ B \一個

如果我嘗試這與os.rename或shutil.move:

os.rename("c:/a", "c:/b") 

我得到

WindowsError: [Error 17] Cannot create a file when that file already exists 

如果我移動單個文件在c:\ a下,它工作。

在python中如何將目錄移動到另一個現有目錄?

+0

是否要將目錄中的所有內容移動到另一個目錄或移動目錄本身? – 182764125216 2011-08-05 14:37:48

回答

16
os.rename("c:/a", "c:/b/a") 

相當於

move c:\a c:\b 

在Windows命令行

0

您將需要國家的完整路徑它被轉移到:

src = 'C:\a' 
dst_dir = 'C:\b' 
last_part = os.path.split(src)[1] 
os.rename(src, os.path.join(dst_dir, last_part)) 

事實上,它看起來像shutil.move會做你想要的東西通過查看其文檔:

如果目標是目錄或目錄的符號鏈接, 源 被移動到目錄中。

(及其source

+0

不幸的是,如果這些文件位於不同的捲上,這將會失敗。 – 2009-07-09 09:46:08

+0

@wuub:你說的是什麼?文檔說,在某些UNIX文件系統中存在古怪的行爲,但OP正在談論Windows。 – cdleary 2009-07-09 09:49:01

+0

嗯,這對於單個目錄來說很簡單,但是將大目錄結構移動到另一個文件夾實際上很不方便。很奇怪,python不支持這一點。 – Ash 2009-07-09 09:51:58

1

當我需要許多文件系統的操作,我更喜歡用 '路徑' 模塊:
http://pypi.python.org/pypi/path.py/2.2

這是相當好的和輕量級的包裝呃圍繞內置的'os.path'模塊。

此外代碼:

last_part = os.path.split(src)[1] 

有點奇怪,原因有爲此特殊功能:

last_part = os.path.basename(src) 
2

os.rename( 「C:/ A /」,「C:/ b「/) - >更改文件夾中的文件夾a的名稱b

os。重命名( 「C:/ A /」, 「C:/ B/A」) - >把文件夾b分成文件夾

0

使用Twisted的FilePath

from twisted.python.filepath import FilePath 
FilePath("c:/a").moveTo(FilePath("c:/b/a")) 

,或者更一般:

from twisted.python.filepath import FilePath 
def moveToExistingDir(fileOrDir, existingDir): 
    fileOrDir.moveTo(existingDir.child(fileOrDir.basename())) 
moveToExistingDir(FilePath("c:/a"), FilePath("c:/b"))