88

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

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"

|
99

Việc đổi tên như vậy khá dễ dàng, ví dụ với các mô đun os và toàn cầu :

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ả *.doccác tệp trong c:\temp\xxthư mục sang new(%s).doc, %stên cơ sở trước đó của tệp (không có phần mở rộng).

|
  • 1

    Làm thế nào là %biểu tượng được sử dụng 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 shoặc fđể xác định định dạng. Tại sao không có gì (không gian) ngay sau %lệnh đã nói?

    – Hoàng Mỹ Kiều 22:32:40 05/04/2014
  • 1

    @ShashankSawant Đây thực sự là một toán tử định dạng. Xem Hoạt động định dạng chuỗi để biết tài liệu và sử dụng mẫu.

    – Hoàng Tâm Thiện 08:50:33 07/04/2014
118

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

Điều này thay thế tất cả các dấu gạch dưới bằng dấu gạch nối trong bất kỳ tệp không bị ẩn nào trong thư mục hiện tại

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

Nếu bạn không phiền khi sử dụng các biểu thức thông thường, thì chức năng này sẽ cung cấp cho bạn nhiều sức mạnh trong việc đổi tên các tệp:

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 tại nơi chứa các tệp):

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

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

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

và hơn thế nữa.

|
11

Tôi có điều này chỉ đơn giản là đổi tên tất cả các tệp 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 đang thay thế tất cả các lần xuất hiện của old_str bằng bất kỳ trường hợp nào bằng new_str.

|
6

Tôi đã tự viết một kịch bản python. Nó nhận làm đối số đường dẫn của thư mục chứa các tệp 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 đính kèm một số tăng (1, 2, 3, v.v.) vào mẫu đặt tên bạn đưa ra.

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 làm việc cho bạn.

|
6

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

Tôi thích đặt các tệp nhạc, phim và ảnh của mình theo 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 thấy mình tự đổi tên từng tệp để phù hợp với phong cách của mình. Điều này đã thực sự cũ rất nhanh, 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 thành tất cả chữ thường, thay thế các chuỗi trong tên tệp bằng bất cứ thứ gì bạn muốn và cắt bất kỳ số lượng ký tự nào từ mặt trước hoặc mặt sau của tên tệp.

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

|
2

Ở trong thư mục mà bạn cần thực hiện đổi tên.

import os
# get the file name list to nameList
nameList = os.listdir() 
#loop through the name and rename
for fileName in nameList:
    rename=fileName[15:28]
    os.rename(fileName,rename)
#example:
#input fileName bulk like :20180707131932_IMG_4304.JPG
#output renamed bulk like :IMG_4304.JPG
|
2

Tôi đã có một vấn đề 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 một phương pháp tương tự. Xem ví dụ dưới đây:

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]))
|
2
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 
|
1
#  another regex version
#  usage example:
#  replacing an underscore in the filename with today's date
#  rename_files('..\\output', '(.*)(_)(.*\.CSV)', '\g<1>_20180402_\g<3>')
def rename_files(path, pattern, replacement):
    for filename in os.listdir(path):
        if re.search(pattern, filename):
            new_filename = re.sub(pattern, replacement, filename)
            new_fullname = os.path.join(path, new_filename)
            old_fullname = os.path.join(path, filename)
            os.rename(old_fullname, new_fullname)
            print('Renamed: ' + old_fullname + ' to ' + new_fullname
|
1

Đối với tôi trong thư mục của tôi, tôi có nhiều thư mục con, mỗi thư mục con có rất nhiều hình ảnh tôi muốn thay đổi tất cả các hình ảnh phụ thành 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

(câu trả lời của riêng mys) https://stackoverflow.com/a/45734381/6329006

|
0

Mã này sẽ hoạt động

Hàm chính xác lấy hai đối số f_patth làm đường dẫn để đổi tên tệp và new_name làm tên mới của bạn thành tệp.

import glob2
import os


def rename(f_path, new_name):
    filelist = glob2.glob(f_path + "*.ma")
    count = 0
    for file in filelist:
        print("File Count : ", count)
        filename = os.path.split(file)
        print(filename)
        new_filename = f_path + new_name + str(count + 1) + ".ma"
        os.rename(f_path+filename[1], new_filename)
        print(new_filename)
        count = count + 1
|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.