2009-07-09 27 views
8

Tôi bị nhầm lẫn với tệp di chuyển dưới python. Dưới cửa sổ dòng lệnh, nếu tôi có thư mục c: \ a và một thư mục c: \ b, tôi có thể làmDi chuyển các tệp theo python

move c:\a c:\b 

trong đó di chuyển một đến kết quả b là cấu trúc thư mục c: \ b \ a

Nếu tôi thử điều này với os.rename hoặc shutil.move:

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

tôi nhận được

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

Nếu tôi di chuyển một tập tin duy nhất dưới c: \ a, nó hoạt động.

Trong python làm cách nào để di chuyển thư mục sang thư mục hiện có khác?

+0

bạn có muốn di chuyển tất cả nội dung của thư mục sang thư mục khác hoặc di chuyển thư mục không? – 182764125216

Trả lời

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

tương đương với

move c:\a c:\b 

dưới cửa sổ dòng lệnh

0

Bạn sẽ cần phải nêu đường dẫn đầy đủ nó đang được chuyển tới:

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

Trên thực tế, có vẻ như shutil.move sẽ làm những gì bạn muốn bằng cách nhìn vào tài liệu của nó:

Nếu điểm đến là một thư mục hoặc một liên kết tượng trưng đến một thư mục, nguồn được di chuyển bên trong thư mục.

(Và source của nó.)

+0

Unfortuneatly điều này sẽ thất bại nếu các tập tin được đặt trên khối lượng khác nhau. –

+0

@wuub: Điều gì khiến bạn nói vậy? Các tài liệu nói rằng có hành vi kỳ quặc trong một số hệ thống tập tin UNIX, nhưng OP đang nói về Windows. – cdleary

+0

Hmm, điều này đơn giản đối với một thư mục duy nhất, nhưng việc di chuyển một cấu trúc thư mục lớn đến một thư mục khác thực sự bất tiện theo cách này. Khá lạ là python không hỗ trợ điều này. – Ash

8

Bạn có thể thử bằng cách sử dụng mô-đun Shutil.

+2

Cụ thể shutil.move (srcFile, destFile) – PTBNL

1

Khi tôi cần nhiều hoạt động hệ thống tập tin tôi thích sử dụng 'path' mô-đun:
http://pypi.python.org/pypi/path.py/2.2

Đó là khá tốt và trọng lượng nhẹ er xung quanh mô-đun 'os.path' được tích hợp sẵn.

Ngoài ra mã:

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

là một chút kỳ lạ, nguyên nhân có chức năng đặc biệt cho việc này:

last_part = os.path.basename(src) 
+0

Điểm tuyệt vời - quên tên cơ sở. Tôi không thích làm thế nào có nhiều hơn một cách để làm điều đó. ;-) – cdleary

2

os.rename ("c:/a /", "c:/b "/) -> Thay đổi tên thư mục a trong thư mục b

os.đổi tên ("c:/a /", "c:/b/a") -> Đặt thư mục b vào thư mục một

0

Sử dụng Twisted của FilePath:

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

hay tổng quát hơn:

from twisted.python.filepath import FilePath 
def moveToExistingDir(fileOrDir, existingDir): 
    fileOrDir.moveTo(existingDir.child(fileOrDir.basename())) 
moveToExistingDir(FilePath("c:/a"), FilePath("c:/b")) 
Các vấn đề liên quan