Cách đổi tên tệp bằng Python


Câu trả lời:


578

Sử dụng os.rename:

import os

os.rename('a.txt', 'b.kml')

52
Cần lưu ý rằng nếu các tệp không nằm trong thư mục làm việc, bạn sẽ cần đường dẫn đầy đủ.
EndermanAPM

không thực sự, trên 3.7
ubfox

2
@toing_toing tất nhiên là nó hoạt động, có lẽ anh ta chỉ có nghĩa là bạn nên biết về thư mục hiện tại và chỉ định đường dẫn liên quan đến nó hoặc chỉ sử dụng đường dẫn tuyệt đối (như C:/folder/file.txttrên Windows hoặc /home/file.txttrên Linux / MacOS).
Alex P.

Điều đáng chú ý là điều này sẽ âm thầm ghi đè lên các tệp trên các hệ thống giống Unix nhưng thất bại với OSErrorcác hệ thống Windows. os.path.existsnên được sử dụng để kiểm tra nếu mục tiêu tồn tại trước khi đổi tên. Điều này không tạo ra lỗi "Thời gian kiểm tra thời gian sử dụng", nhưng không có khả năng gây ra sự cố. (Tôi biết không có cách nào dễ dàng xung quanh điều này - xem tại đây .
AnnanFay

2
Nếu người dùng thực sự muốn thay thế tệp trên bất kỳ hệ điều hành nào, thì nên sử dụngos.replace
LucG

73

Tệp có thể nằm trong một thư mục, trong trường hợp đó chỉ định đường dẫn:

import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)

49
import shutil

shutil.move('a.txt', 'b.kml')

Điều này sẽ làm việc để đổi tên hoặc di chuyển một tập tin.


32
shutil.movekhông phải là một lựa chọn tốt do không phải là một hoạt động nguyên tử. Ví dụ, nếu tệp được mở, shutil.movesẽ tạo một tệp với new_name, nhưng sẽ không xóa tệp old_namedo đó để lại cho bạn hai tệp. os.renamemặt khác sẽ không làm gì, đó là một lựa chọn tốt hơn . Với shutil.move, ngay cả khi bạn bắt gặp lỗi, bạn vẫn sẽ phải lo lắng về việc kiểm tra và xóa tệp giả mạo. Chỉ không đáng khi nó tồn tại một công cụ tốt hơn :os.rename .
mvbentes

34

Kể từ Python 3,4, người ta có thể sử dụng mô-đun pathlib để giải quyết vấn đề này.

Nếu bạn tình cờ ở phiên bản cũ hơn, bạn có thể sử dụng phiên bản backported được tìm thấy ở đây

Giả sử bạn không ở trong đường dẫn gốc (chỉ cần thêm một chút khó khăn vào nó) bạn muốn đổi tên và phải cung cấp một đường dẫn đầy đủ, chúng ta có thể xem xét điều này:

some_path = 'a/b/c/the_file.extension'

Vì vậy, bạn có thể lấy đường dẫn của mình và tạo một Pathđối tượng từ đó:

from pathlib import Path
p = Path(some_path)

Chỉ cần cung cấp một số thông tin xung quanh đối tượng này mà chúng ta có bây giờ, chúng ta có thể trích xuất những thứ từ nó. Ví dụ: nếu vì bất kỳ lý do gì chúng tôi muốn đổi tên tệp bằng cách sửa đổi tên tệp từ the_filethành the_file_1, thì chúng tôi có thể lấy phần tên tệp:

name_without_extension = p.stem

Và vẫn giữ phần mở rộng trong tay là tốt:

ext = p.suffix

Chúng tôi có thể thực hiện sửa đổi của mình với một thao tác chuỗi đơn giản:

Python 3.6 và lớn hơn sử dụng chuỗi f!

new_file_name = f"{name_without_extension}_1"

Nếu không thì:

new_file_name = "{}_{}".format(name_without_extension, 1)

Và bây giờ chúng ta có thể thực hiện đổi tên bằng cách gọi renamephương thức trên đối tượng đường dẫn mà chúng ta đã tạo và nối thêm extđể hoàn thành cấu trúc đổi tên phù hợp mà chúng ta muốn:

p.rename(Path(p.parent, new_file_name + ext))

Một thời gian ngắn nữa để thể hiện sự đơn giản của nó:

Python 3.6+:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, f"{p.stem}_1_{p.suffix}"))

Các phiên bản ít hơn Python 3.6 sử dụng phương thức định dạng chuỗi thay thế:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))

3
Tại sao bạn sẽ làm điều này thay vì câu trả lời được chấp nhận? Có vẻ phức tạp hơn nhiều
rbennell

19
Vâng @rbennell, hầu hết câu trả lời này là một lời giải thích. Câu trả lời thực sự chỉ là ba dòng ở cuối. Hơn nữa, câu trả lời được chấp nhận được thực hiện rõ ràng cho chính sự thay đổi tên đó. Câu trả lời này cung cấp một cách để hiển thị cách bạn có thể thao tác tên tệp để bảo toàn các phần bạn muốn trong đường dẫn hoặc tên của tệp. Hơn nữa, pathlibthư viện được giới thiệu trong python 3.4, vì vậy việc chia sẻ câu trả lời ở đây cũng cung cấp độ phơi sáng cho một mô-đun rắn để thể hiện tính linh hoạt và cách sử dụng của nó cho các yêu cầu phức tạp hơn.
idjaw

4
Cảm ơn bạn @idjaw, bình luận của bạn là một câu trả lời tốt cho một câu hỏi cơ bản của người mới bắt đầu, một cách đơn giản Tại sao bạn lại làm vậy? . Ngoài ra, thật thú vị khi thấy cách tiếp cận không thù địch trên internet đối với những gì thường được coi là không biết gì.
Igor V.

3
@SasukeUchiha - Các {}định dạng chuỗi, bạn có thể đọc về đây . Cuối cùng, những gì đang xảy ra là {}get được thay thế bằng các biến được truyền vào formatphương thức. Vì vậy, cái đầu tiên {}sẽ giữ những gì trong đó name_without_extension, và cái thứ hai sẽ giữ đối số thứ hai đơn giản 1.
idjaw

3
Sử dụng chuỗi f đơn giản hóa nó nhiều hơn. từ pathlib nhập Đường dẫn p = Đường dẫn (some_path) phiên bản = 1 p.rename (Đường dẫn (p.parent, f "{p.stem} _ {phiên bản}" + p.suffix))
Liquidgenius


8

Sử dụng os.rename. Nhưng bạn phải truyền đầy đủ đường dẫn của cả hai tệp vào hàm. Nếu tôi có một tệp a.txttrên máy tính để bàn của mình thì tôi sẽ làm và tôi cũng phải cung cấp đầy đủ các tệp đã đổi tên.

 os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')

1
"Phải" không đúng. Bạn luôn có thể thay thế một tên tệp tương đối cho một tên tệp tuyệt đối và ngược lại. Điều thường làm người mới bắt đầu là họ không hiểu tên tệp tương đối liên quan đến thư mục làm việc hiện tại như thế nào.
tripleee

3
import os

# Set the path
path = 'a\\b\\c'  
# save current working directory
saved_cwd = os.getcwd()
# change your cwd to the directory which contains files
os.chdir(path)
os.rename('a.txt', 'b.klm')
# moving back to the directory you were in 
os.chdir(saved_cwd)

1
Hãy cảnh giác khi làm theo cách này. Bạn không thể luôn luôn chdir()vào một thư mục, ví dụ như những gì xảy ra trong Windows khi nó là UNC? Và làm một chdir()có tác dụng phụ. Tôi chỉ muốn chỉ định các đường dẫn cần thiết để os.rename()trực tiếp, không chdir()ing.
JonBrave

0

Bạn có thể sử dụng os.system để gọi terminal để hoàn thành nhiệm vụ:

os.system('mv oldfile newfile')

có, điều này sẽ chỉ hoạt động trên một máy dựa trên unix như mvlà một chương trình dòng lệnh unix dựng sẵn để di chuyển / đổi tên một tập tin.
Mikhail Geyer

8
Tại sao bạn lại gọi một thiết bị đầu cuối và định nghĩa một lệnh chỉ UNIX khi bạn có thể thực hiện nó từ python theo cách đa nền tảng?
EndermanAPM

0
import os
import re
from pathlib import Path

for f in os.listdir(training_data_dir2):
  for file in os.listdir( training_data_dir2 + '/' + f):
    oldfile= Path(training_data_dir2 + '/' + f + '/' + file)
    newfile = Path(training_data_dir2 + '/' + f + '/' + file[49:])
    p=oldfile
    p.rename(newfile)

1
Mã hóa cứng về phía trước là dấu phân cách đường dẫn và pha trộn kiểu cũ os.pathvới hiện đại pathliblà khá iffy. Đi tất cả các cách với pathlibthay thế.
tripleee

0
import shutil
import os

files = os.listdir("./pics/") 

for key in range(0, len(files)):
   print files[key]
   shutil.move("./pics/" + files[key],"./pics/img" + str(key) + ".jpeg")

Điều này nên làm điều đó. trăn 3+


... hoặc sử dụng phép liệt kê cho phiên bản dễ đọc hơn một chút: cho khóa, tên trong bảng liệt kê (tệp):
Thẻ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.