Batch Mengganti Nama File dalam Direktori

102

Apakah ada cara mudah untuk mengganti nama sekelompok file yang sudah ada dalam direktori, menggunakan Python?

Contoh: Saya memiliki direktori yang penuh dengan file * .doc dan saya ingin mengganti namanya secara konsisten.

X.doc -> "baru (X) .doc"

Y.doc -> "baru (Y) .doc"

Nate
sumber

Jawaban:

114

Mengganti nama seperti itu cukup mudah, misalnya dengan modul os dan glob :

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))

Anda kemudian dapat menggunakannya dalam contoh Anda seperti ini:

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

Contoh di atas akan mengonversi semua *.docfile dalam c:\temp\xxdir ke new(%s).doc, di mana %snama dasar file sebelumnya (tanpa ekstensi).

DzinX
sumber
1
Bagaimana %simbol digunakan dalam perintah os.path.join(dir, titlePattern % title + ext)? Saya tahu %ini untuk operasi modulo dan juga digunakan sebagai operator format. Tapi biasanya diikuti dengan satau funtuk menentukan format. Mengapa tidak ada (spasi) segera setelah %dalam perintah tersebut?
Shashank Sawant
3
@ShashankSawant Ini memang operator pemformatan. Lihat Operasi Pemformatan String untuk dokumentasi dan contoh penggunaan.
DzinX
133

Saya lebih suka menulis satu baris kecil untuk setiap penggantian yang harus saya lakukan daripada membuat kode yang lebih umum dan kompleks. Misalnya:

Ini menggantikan semua garis bawah dengan tanda hubung di file yang tidak tersembunyi di direktori saat ini

import os
[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')]
Cesar Canassa
sumber
4
Jauh lebih mudah daripada metode lainnya. INILAH mengapa saya menyukai Python.
Dan Gayle
Terlalu banyak waktu yang terbuang hari ini mencoba mencari tahu mengapa perintah "ganti nama" saya tidak berfungsi - seharusnya datang ke sini dulu! Satu baris Pythonic yang hebat!
Devin
Tidak berfungsi karena Windows terus menata ulang file berdasarkan urutan abjad setelah masing-masing rename:(
ytpillai
4
Luar biasa tetapi hanya berfungsi dengan dir tanpa sub dir.
Hill
jika Anda no such file erroringat os.renameperlu jalur penuh
Windsooon
22

Jika Anda tidak keberatan menggunakan ekspresi reguler, maka fungsi ini akan memberi Anda banyak kekuatan dalam mengganti nama file:

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))

Jadi dalam contoh Anda, Anda dapat melakukannya (dengan asumsi itu adalah direktori saat ini di mana file tersebut berada):

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

tetapi Anda juga dapat memutar kembali ke nama file awal:

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

dan lainnya.

tzot.dll
sumber
11

Saya memiliki ini untuk hanya mengganti nama semua file di subfolder folder

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)))

Saya mengganti semua kejadian old_str dengan kasus apapun dengan new_str.

kiriloff
sumber
Kode ini benar-benar digunakan untuk mengganti bagian mana pun dari judul file di direktori.
geoJshaun
6

Coba: http://www.mattweber.org/2007/03/04/python-script-renamepy/

Saya suka file musik, film, dan gambar saya diberi nama dengan cara tertentu. Saat saya mendownload file dari internet, biasanya file tersebut tidak mengikuti konvensi penamaan saya. Saya menemukan diri saya secara manual mengganti nama setiap file agar sesuai dengan gaya saya. Ini menjadi sangat cepat tua, jadi saya memutuskan untuk menulis program untuk melakukannya untuk saya.

Program ini dapat mengubah nama file menjadi huruf kecil semua, mengganti string dalam nama file dengan apapun yang Anda inginkan, dan memotong sejumlah karakter dari depan atau belakang nama file.

Kode sumber program juga tersedia.

xsl
sumber
1
Sayangnya tautannya rusak, apakah ada yang tahu di mana kode sumbernya?
ryanpcmcquen
6

Saya telah menulis skrip python sendiri. Argumen ini mengambil jalur direktori tempat file berada dan pola penamaan yang ingin Anda gunakan. Namun, itu mengganti nama dengan melampirkan nomor tambahan (1, 2, 3 dan seterusnya) ke pola penamaan yang Anda berikan.

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

Semoga ini berhasil untuk Anda.

harisibrahimkv.dll
sumber
5

Berada di direktori tempat Anda perlu melakukan penggantian nama.

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
Ajay Chandran
sumber
untuk "berada di direktori ..." gunakanos.chdir(path_of_directory)
MagTun
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 
frank__aguirre
sumber
2

Saya memiliki masalah serupa, tetapi saya ingin menambahkan teks ke awal nama file dari semua file dalam sebuah direktori dan menggunakan metode serupa. Lihat contoh di bawah ini:

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]))
Amber Davis
sumber
1

bagi saya di direktori saya, saya memiliki banyak subdir, setiap subdir memiliki banyak gambar, saya ingin mengubah semua gambar subdir menjadi 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

(jawaban saya sendiri) https://stackoverflow.com/a/45734381/6329006

Jayhello
sumber
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
Dan
sumber
1

Jika Anda ingin mengubah nama file dalam editor (seperti vim), perpustakaan klik dilengkapi dengan perintah click.edit(), yang dapat digunakan untuk menerima masukan pengguna dari editor. Berikut adalah contoh bagaimana ini dapat digunakan untuk memfaktor ulang file dalam direktori.

import click
from pathlib import Path

# current directory
direc_to_refactor = Path(".")

# list of old file paths
old_paths = list(direc_to_refactor.iterdir())

# list of old file names
old_names = [str(p.name) for p in old_paths]

# modify old file names in an editor,
# and store them in a list of new file names
new_names = click.edit("\n".join(old_names)).split("\n")

# refactor the old file names
for i in range(len(old_paths)):
    old_paths[i].replace(direc_to_refactor / new_names[i])

Saya menulis aplikasi baris perintah yang menggunakan teknik yang sama, tetapi itu mengurangi volatilitas skrip ini, dan hadir dengan lebih banyak opsi, seperti pemfaktoran ulang rekursif. Ini adalah tautan ke halaman github . Ini berguna jika Anda menyukai aplikasi baris perintah, dan tertarik untuk membuat beberapa pengeditan cepat pada nama file. (Aplikasi saya mirip dengan perintah "bulkrename" yang ditemukan di ranger ).

Jim Shaddix
sumber
1
Sementara kami mendorong tautan ke sumber daya eksternal, kami tidak menyarankan jawaban hanya tautan karena dianggap tidak berguna saat tautan kedaluwarsa. Harap perbarui tanggapan Anda untuk menyertakan jawaban atas pertanyaan :)
IT Delinquent
Benar. Saya akan mengedit posting saya. Ini adalah kontribusi pertama saya jadi saya menghargai bimbingannya!
Jim Shaddix
0

Kode ini akan berfungsi

Fungsi tersebut secara tepat mengambil dua argumen f_patth sebagai jalur Anda untuk mengganti nama file dan nama_baru sebagai nama baru Anda ke file.

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
murthy annavajhula
sumber