2015-05-11 16 views
7

Khi tựa đề cho biết, tôi muốn chương trình python thay đổi tên tệp, nhưng tôi muốn ghi đè nếu đã có tệp với tên đích đó.Chương trình Python đổi tên tệp khi ghi đè nếu đã có tệp đó

import os, sys 

original = sys.argv[1] 
output = sys.argv[2] 

os.rename(original, output) 

Nhưng mã của tôi chỉ hiển thị cho tôi lỗi này khi đã có tệp với tên đích đó.

os.rename<original, output> 
WindowsError: [Error 183] Cannot create a file when that file already exists 

Tôi nên làm gì để khắc phục?

+0

Di chuyển các tập tin và thử lại? – jonrsharpe

Trả lời

6

Trên Windows os.rename sẽ không thay thế tệp đích nếu nó tồn tại. Bạn phải loại bỏ nó trước. Bạn có thể bắt lỗi và thử lại sau khi gỡ bỏ các tập tin:

import os 

original = sys.argv[1] 
output = sys.argv[2] 

try: 
    os.rename(original, output) 
except WindowsError: 
    os.remove(output) 
    os.rename(original, output) 
0

Lỗi này chỉ xảy ra trên cửa sổ, như bạn có thể tìm thấy trong tài liệu python (https://docs.python.org/2/library/os.html#os.rename)

Bạn nên kiểm tra xem đã có một tập tin hoặc thư mục trên đích, với đoạn mã sau:

import os.path 
os.path.exists(destination) 

Xem thêm câu trả lời này: https://stackoverflow.com/a/84173/955026

Nếu tệp tồn tại, hãy xóa tệp trước tiên trước khi đổi tên tệp gốc. Tất nhiên bạn nên kiểm tra xem bạn có đang không xóa tệp gốc (vì vậy script.py file1 file1 không nên xóa tệp 1).

3

Bạn có thể sử dụng shutil.move, nó sẽ ghi đè lên trên cửa sổ:

from shutil import move 

move(src,dest) 

Demo:

In [10]: ls  
Directory of C:\Users\padraic\Desktop 

11/05/2015 20:20 <DIR>   . 
11/05/2015 20:20 <DIR>   .. 
11/05/2015 20:20     0 bar.txt 
11/05/2015 20:20     0 foo.txt 
       2 File(s)    0 bytes 
       2 Dir(s) 47,405,617,152 bytes free 

In [11]: shutil.move("bar.txt","foo.txt")  
In [12]: ls 
Directory of C:\Users\padraic\Desktop  
11/05/2015 20:20 <DIR>   . 
11/05/2015 20:20 <DIR>   .. 
11/05/2015 20:20     0 foo.txt 
       1 File(s)    0 bytes 
       2 Dir(s) 47,405,613,056 bytes free 
In [13]: shutil.move("foo.txt","bar.txt") 
In [14]: ls 
Volume in drive C has no label. 
Volume Serial Number is 3C67-52B9 

Directory of C:\Users\padraic\Desktop 

11/05/2015 20:24 <DIR>   . 
11/05/2015 20:24 <DIR>   .. 
11/05/2015 20:20     0 bar.txt 
       1 File(s)    0 bytes 
       2 Dir(s) 47,405,568,000 bytes free 
+0

Cảm ơn bạn nhưng điều này thực sự có ghi đè không? Có vẻ như nó chỉ bỏ qua nó khi có tệp đích .. – user42459

+0

@ user42459, nó sẽ thay thế tệp đích, nếu bạn di chuyển tệp có cùng tên bạn sẽ thấy –

Các vấn đề liên quan