2009-07-09 2 views
8

Я смущен файлом, перемещающимся под python. Под окнами командной строки, если у меня есть каталог C: \ а и каталог C: \ б, я могу сделатьПеремещение файлов под python

move c:\a 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

ответ

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

эквивалентно

move c:\a c:\b 

под окнами командной строки

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

Несчастливо это не удастся, если файлы расположены на разных томах. –

+0

@ wuub: Почему вы так говорите? Документы говорят, что в некоторых файловых системах UNIX есть странное поведение, но OP говорит о Windows. – cdleary

+0

Хм, это просто для одного каталога, но перемещение большой структуры каталогов в другую папку действительно неудобно. Весьма странно, что python этого не поддерживает. – Ash

8

Вы можете попробовать использовать Shutil модуль.

+2

В частности, shutil.move (srcFile, destFile) – PTBNL

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) 
+0

Отличная точка - забыли о basename. Мне не нравится, как есть более чем один способ сделать это. ;-) – cdleary

2

os.rename ("C:/а /", «C:/b "/) -> Изменяет имя папки a в папке b

os.переименовать ("C:/а /", "C:/б/у") -> Поместите папку б в папку по

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")) 
Смежные вопросы