2008-10-22 78 views
76

Có cách dễ dàng để đổi tên một nhóm tệp đã có trong thư mục không, bằng cách sử dụng Python?Đổi tên hàng loạt các tệp trong một thư mục

Ví dụ: Tôi có một thư mục chứa đầy đủ các tệp * .doc và tôi muốn đổi tên chúng theo cách nhất quán.

X.doc -> "mới (X) .doc"

Y.doc -> "mới (Y) .doc"

Trả lời

90

đổi tên như vậy là khá dễ dàng, ví dụ với osglob module:

import glob, os 

def rename(dir, pattern, titlePattern): 
    for pathAndFilename in glob.iglob(os.path.join(dir, pattern)): 
     title, ext = os.path.splitext(os.path.basename(pathAndFilename)) 
     os.rename(pathAndFilename, 
        os.path.join(dir, titlePattern % title + ext)) 

Sau đó, bạn có thể sử dụng nó trong ví dụ của bạn như thế này:

rename(r'c:\temp\xx', r'*.doc', r'new(%s)') 

Ví dụ trên sẽ chuyển đổi tất cả *.doc tệp trong số c:\temp\xx dir đến new(%s).doc, trong đó %s là tên cơ sở trước đó của tệp (không có tiện ích mở rộng).

+1

Biểu tượng '%' được sử dụng như thế nào trong lệnh 'os.path.join (dir, titlePattern% title + ext) '? Tôi biết '%' là cho hoạt động modulo và cũng được sử dụng như một toán tử định dạng. Nhưng thông thường nó được theo sau bởi 's' hoặc' f' để chỉ định định dạng. Tại sao không có gì (không gian) ngay sau khi '%' trong lệnh được nói? –

+3

@ShashankSawant Nó thực sự là một nhà điều hành định dạng. Xem [Hoạt động định dạng chuỗi] (https://docs.python.org/2/library/stdtypes.html#string-formatting) để biết tài liệu và cách sử dụng mẫu. – DzinX

6

Hãy thử: http://www.mattweber.org/2007/03/04/python-script-renamepy/

Tôi thích có nhạc, phim và các tệp hình ảnh có tên là một cách nhất định. Khi tôi tải xuống các tệp từ Internet , chúng thường không tuân theo quy ước đặt tên của tôi. Tôi đã tìm thấy chính mình đổi tên thủ công từng tệp để phù hợp với kiểu của tôi. Điều này đã cũ thực sự nhanh chóng, vì vậy tôi quyết định viết một chương trình để làm điều đó cho tôi.

Chương trình này có thể chuyển đổi tên tập tin cho tất cả các chữ thường, thay thế các chuỗi trong tên tập tin với bất cứ điều gì bạn muốn, và cắt bất kỳ số lượng ký tự từ mặt trước hoặc mặt sau của tên tập tin.

Mã nguồn của chương trình cũng có sẵn.

+0

bạn đã lưu tôi.thank bạn. –

+1

Thật không may là liên kết bị hỏng, có ai biết mã nguồn ở đâu không? – ryanpcmcquen

20

Nếu bạn không nhớ sử dụng biểu thức thông thường, sau đó chức năng này sẽ cung cấp cho bạn nhiều năng lượng trong các tập tin đổi tên:

import re, glob, os 

def renamer(files, pattern, replacement): 
    for pathname in glob.glob(files): 
     basename= os.path.basename(pathname) 
     new_filename= re.sub(pattern, replacement, basename) 
     if new_filename != basename: 
      os.rename(
       pathname, 
       os.path.join(os.path.dirname(pathname), new_filename)) 

Vì vậy, trong ví dụ của bạn, bạn có thể làm (giả sử đó là thư mục hiện nơi các tập tin là):

renamer("*.doc", r"^(.*)\.doc$", r"new(\1).doc") 

nhưng bạn cũng có thể quay trở lại với tên tập tin ban đầu:

renamer("*.doc", r"^new\((.*)\)\.doc", r"\1.doc") 

và hơn thế nữa.

93

Tôi thích viết một lớp lót nhỏ cho mỗi thay thế mà tôi phải làm thay vì tạo mã chung và phức tạp hơn. Ví dụ.:

này thay thế tất cả nhấn mạnh với dấu gạch nối ở bất kỳ tập tin không ẩn trong thư mục hiện

import os 
[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')] 
+4

Vì vậy, dễ dàng hơn nhiều so với các phương pháp khác. Đây là lý do tại sao tôi yêu Python. –

+0

Điều này thật tuyệt vời. – warpedspeed

+0

Cách lãng phí quá nhiều thời gian ngày hôm nay cố gắng tìm ra lý do tại sao lệnh "đổi tên" của tôi không hoạt động - nên đã đến đây đầu tiên! Great Pythonic một lớp lót! – Devin

6

Tôi đã viết một kịch bản python trên của riêng tôi. Nó lấy làm đối số đường dẫn của thư mục trong đó các tệp có mặt và mẫu đặt tên mà bạn muốn sử dụng. Tuy nhiên, nó đổi tên bằng cách gắn một số gia tăng (1, 2, 3 và vv) vào mẫu đặt tên bạn cung cấp.

import os 
import sys 

# checking whether path and filename are given. 
if len(sys.argv) != 3: 
    print "Usage : python rename.py <path> <new_name.extension>" 
    sys.exit() 

# splitting name and extension. 
name = sys.argv[2].split('.') 
if len(name) < 2: 
    name.append('') 
else: 
    name[1] = ".%s" %name[1] 

# to name starting from 1 to number_of_files. 
count = 1 

# creating a new folder in which the renamed files will be stored. 
s = "%s/pic_folder" % sys.argv[1] 
try: 
    os.mkdir(s) 
except OSError: 
    # if pic_folder is already present, use it. 
    pass 

try: 
    for x in os.walk(sys.argv[1]): 
     for y in x[2]: 
      # creating the rename pattern. 
      s = "%spic_folder/%s%s%s" %(x[0], name[0], count, name[1]) 
      # getting the original path of the file to be renamed. 
      z = os.path.join(x[0],y) 
      # renaming. 
      os.rename(z, s) 
      # incrementing the count. 
      count = count + 1 
except OSError: 
    pass 

Hy vọng điều này phù hợp với bạn.

10

Tôi có điều này chỉ đơn giản là đổi tên tất cả các file trong thư mục con của thư mục

import os 

def replace(fpath, old_str, new_str): 
    for path, subdirs, files in os.walk(fpath): 
     for name in files: 
      if(old_str.lower() in name.lower()): 
       os.rename(os.path.join(path,name), os.path.join(path, 
              name.lower().replace(old_str,new_str))) 

Tôi thay thế tất cả các lần xuất hiện của old_str với bất kỳ trường hợp bởi new_str.

+0

Mã này thực sự được sử dụng để thay thế bất kỳ phần nào của tiêu đề của một tệp trong một thư mục. – ShaunO

1
directoryName = "Photographs" 
filePath = os.path.abspath(directoryName) 
filePathWithSlash = filePath + "\\" 

for counter, filename in enumerate(os.listdir(directoryName)): 

    filenameWithPath = os.path.join(filePathWithSlash, filename) 

    os.rename(filenameWithPath, filenameWithPath.replace(filename,"DSC_" + \ 
      str(counter).zfill(4) + ".jpg")) 

# e.g. filename = "photo1.jpg", directory = "c:\users\Photographs"   
# The string.replace call swaps in the new filename into 
# the current filename within the filenameWitPath string. Which  
# is then used by os.rename to rename the file in place, using the 
# current (unmodified) filenameWithPath. 

# os.listdir delivers the filename(s) from the directory 
# however in attempting to "rename" the file using os 
# a specific location of the file to be renamed is required. 

# this code is from Windows 
0

như với tôi trong thư mục của tôi, tôi có nhiều subdir, mỗi subdir có nhiều hình ảnh tôi muốn thay đổi tất cả những hình ảnh subdir để 1.jpg ~ n.jpg

def batch_rename(): 
    base_dir = 'F:/ad_samples/test_samples/' 
    sub_dir_list = glob.glob(base_dir + '*') 
    # print sub_dir_list # like that ['F:/dir1', 'F:/dir2'] 
    for dir_item in sub_dir_list: 
     files = glob.glob(dir_item + '/*.jpg') 
     i = 0 
     for f in files: 
      os.rename(f, os.path.join(dir_item, str(i) + '.jpg')) 
      i += 1 

(MYS sở hữu answer) https://stackoverflow.com/a/45734381/6329006

1

Tôi đã gặp sự cố tương tự nhưng tôi muốn nối văn bản vào đầu tên tệp của tất cả các tệp trong một thư mục và sử dụng phương pháp tương tự. Xem ví dụ bên dưới:

folder = r"R:\mystuff\GIS_Projects\Website\2017\PDF" 

import os 


for root, dirs, filenames in os.walk(folder): 


for filename in filenames: 
    fullpath = os.path.join(root, filename) 
    filename_split = os.path.splitext(filename) # filename will be filename_split[0] and extension will be filename_split[1]) 
    print fullpath 
    print filename_split[0] 
    print filename_split[1] 
    os.rename(os.path.join(root, filename), os.path.join(root, "NewText_2017_" + filename_split[0] + filename_split[1])) 
Các vấn đề liên quan