Bir Dizindeki Dosyaları Toplu Olarak Yeniden Adlandırma


102

Bir dizinde zaten bulunan bir grup dosyayı Python kullanarak yeniden adlandırmanın kolay bir yolu var mı?

Örnek: * .doc dosyalarıyla dolu bir dizinim var ve bunları tutarlı bir şekilde yeniden adlandırmak istiyorum.

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

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

Yanıtlar:


115

Böyle bir yeniden adlandırma oldukça kolaydır, örneğin os ve glob modülleri ile:

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

Daha sonra örneğinizde şu şekilde kullanabilirsiniz:

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

Yukarıdaki örnekte tüm dönüştürecektir *.docdosyaları c:\temp\xxiçin dir new(%s).doc, %s(uzantısı olmadan) dosyanın önceki baz adıdır.


1
Komutta %sembol nasıl kullanılır os.path.join(dir, titlePattern % title + ext)? %Modulo işlemi için olduğunu biliyorum ve aynı zamanda biçimlendirme operatörü olarak da kullanılıyor. Ancak, genellikle biçimini belirtmek için sveya file izlenir . Neden %adı geçen komuttan hemen sonra hiçbir şey (boşluk) yok ?
Shashank Sawant

3
@ShashankSawant Gerçekten bir biçimlendirme operatörüdür. Belgeler ve örnek kullanım için Dize Biçimlendirme İşlemlerine bakın .
DzinX

133

Daha genel ve karmaşık bir kod yapmak yerine, yapmam gereken her değişiklik için küçük bir satır yazmayı tercih ederim. Örneğin:

Bu, geçerli dizindeki gizli olmayan herhangi bir dosyadaki tüm alt çizgileri kısa çizgilerle değiştirir.

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

4
Diğer yöntemlerden çok daha kolay. Bu yüzden Python'u seviyorum.
Dan Gayle

Bugün "yeniden adlandır" komutumun neden çalışmadığını anlamaya çalışırken çok fazla zaman harcadım - buraya önce gelmeliydim! Büyük Pythonic tek çizgili!
Devin

rename
Çalışmıyor

4
Mükemmel ama yalnızca alt dizini olmayan bir dizinle çalışır.
Hill

Eğer alırsanız no such file errorsadece hatırlıyorum os.renametam yolunu gerek
Windsooon

22

Normal ifadeler kullanmaktan çekinmiyorsanız, bu işlev dosyaları yeniden adlandırmada size çok fazla güç verecektir:

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

Dolayısıyla, örneğinizde şunları yapabilirsiniz (dosyaların bulunduğu geçerli dizin olduğunu varsayarak):

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

ancak ilk dosya adlarına da geri dönebilirsiniz:

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

ve dahası.


11

Klasörün alt klasörlerindeki tüm dosyaları yeniden adlandırmak için buna sahibim

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

Old_str'in tüm oluşumlarını herhangi bir durumla yeni_str ile değiştiriyorum.


Bu kod, bir dizindeki bir dosyanın bir başlığının herhangi bir bölümünü değiştirmek için gerçekten kullanılır.
geoJshaun

6

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

Müzik, film ve resim dosyalarımın belirli bir şekilde adlandırılmasını seviyorum. Dosyaları internetten indirdiğimde, genellikle benim adlandırma kuralıma uymuyorlar. Her dosyayı kendi tarzıma uyacak şekilde manuel olarak yeniden adlandırırken buldum. Bu gerçekten hızlı bir şekilde eskidi, ben de bunu benim için yapacak bir program yazmaya karar verdim.

Bu program dosya adını tamamen küçük harfe dönüştürebilir, dosya adındaki dizeleri istediğiniz gibi değiştirebilir ve dosya adının önünden veya arkasından istediğiniz sayıda karakteri kırpabilir.

Programın kaynak kodu da mevcuttur.


1
Maalesef bağlantı koptu, kaynak kodun nerede olduğunu bilen var mı?
ryanpcmcquen

6

Kendi başıma bir python betiği yazdım. Bağımsız değişken olarak dosyaların bulunduğu dizinin yolunu ve kullanmak istediğiniz adlandırma modelini alır. Bununla birlikte, verdiğiniz adlandırma modeline artan bir sayı (1, 2, 3 vb.) Ekleyerek yeniden adlandırır.

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

Umarım bu sizin için çalışır.


5

Yeniden adlandırmayı gerçekleştirmeniz gereken dizinde olun.

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

"dizinde olmak ..." için kullanınos.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 

2

Benzer bir sorun yaşadım, ancak bir dizindeki tüm dosyaların dosya adının başına metin eklemek istedim ve benzer bir yöntem kullandım. Aşağıdaki örneğe bakın:

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

1

bana gelince, dizinimde birden fazla alt dizinim var, her alt dizinde çok sayıda resim var Tüm alt dizin resimlerini 1.jpg ~ n.jpg olarak değiştirmek istiyorum

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

(benim kendi cevabım) https://stackoverflow.com/a/45734381/6329006


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

Bir düzenleyicide (vim gibi) dosya adlarını değiştirmek isterseniz, tıklama kitaplığı click.edit()bir düzenleyiciden kullanıcı girdisi almak için kullanılabilen komutla birlikte gelir . İşte bir dizindeki dosyaları yeniden düzenlemek için nasıl kullanılabileceğine dair bir örnek.

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

Aynı tekniği kullanan, ancak bu komut dosyasının değişkenliğini azaltan ve yinelemeli yeniden düzenleme gibi daha fazla seçenek içeren bir komut satırı uygulaması yazdım. İşte github sayfasının bağlantısı . Bu, komut satırı uygulamalarını seviyorsanız ve dosya adlarında bazı hızlı düzenlemeler yapmak istiyorsanız kullanışlıdır. (Başvurum bulunan "bulkrename" komutuna benzer ranger ).


1
Dış kaynaklara bağlantıları teşvik ederken, bağlantının süresi dolduğunda işe yaramaz hale geldiklerinden, yalnızca bağlantı içeren yanıtları cesaretlendirmiyoruz. Lütfen yanıtınızı sorunun yanıtını içerecek şekilde güncelleyin :)
IT Delinquent

Kesinlikle. Yazımı düzenleyeceğim. Bu benim ilk katkım, bu yüzden rehberliği takdir ediyorum!
Jim Shaddix

0

Bu kod çalışacak

İşlev, dosyayı yeniden adlandırmak için yolunuz olarak f_patth ve dosyaya yeni adınız olarak tam olarak iki bağımsız değişken alır.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.