2009-07-09 109 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"))