python - एक निर्देशिका में फ़ाइलों का बैच नामकरण




file-io rename (7)

आज़माएं: http://www.mattweber.org/2007/03/04/python-script-renamepy/

मुझे अपना संगीत, फिल्म और चित्र फ़ाइलों को एक निश्चित तरीके से नामित करना पसंद है। जब मैं इंटरनेट से फ़ाइलें डाउनलोड करता हूं, तो वे आमतौर पर मेरे नामकरण सम्मेलन का पालन नहीं करते हैं। मैंने अपनी शैली को फिट करने के लिए प्रत्येक फ़ाइल को मैन्युअल रूप से नामित किया। यह पुराना सचमुच तेज़ हो गया, इसलिए मैंने इसे मेरे लिए करने के लिए एक कार्यक्रम लिखने का फैसला किया।

यह प्रोग्राम फ़ाइल नाम को सभी लोअरकेस में परिवर्तित कर सकता है, जो भी आप चाहते हैं उसके साथ फ़ाइल नाम में तारों को प्रतिस्थापित कर सकते हैं, और फ़ाइल नाम के सामने या पीछे से किसी भी संख्या को ट्रिम कर सकते हैं।

कार्यक्रम का स्रोत कोड भी उपलब्ध है।

क्या Python का उपयोग कर निर्देशिका में पहले से मौजूद फाइलों के समूह का नाम बदलने का कोई आसान तरीका है?

उदाहरण: मेरे पास * .doc फ़ाइलों से भरा निर्देशिका है और मैं उन्हें लगातार तरीके से पुनर्नामित करना चाहता हूं।

एक्स डॉक -> "नया (एक्स)। डॉक"

Y.doc -> "नया (वाई) .doc"


इस तरह के नामकरण काफी आसान है, उदाहरण के लिए os और 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))

इसके बाद आप इसे अपने उदाहरण में इस्तेमाल कर सकते हैं:

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

उपरोक्त उदाहरण सभी *.doc फ़ाइलों को c:\temp\xx dir में new(%s).doc परिवर्तित करेगा, जहां %s फ़ाइल का पिछला आधार नाम है (एक्सटेंशन के बिना)।


मेरे पास फ़ोल्डर के सबफ़ोल्डर में बस सभी फ़ाइलों का नाम बदलने के लिए है

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

मैं new_str द्वारा किसी भी मामले के साथ old_str के सभी अवसरों को प्रतिस्थापित कर रहा हूं।


मेरे लिए मेरी निर्देशिका में मेरे पास एकाधिक उपदिर हैं, प्रत्येक उपदिर में बहुत सारी छवियां हैं जिन्हें मैं सभी उपदिर छवियों को 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

(मेरा अपना जवाब) https://.com/a/45734381/6329006


मैंने अपने आप पर एक अजगर लिपि लिखी है। यह निर्देशिका के पथ के रूप में तर्क देता है जिसमें फाइल मौजूद हैं और नामकरण पैटर्न जिसे आप उपयोग करना चाहते हैं। हालांकि, यह आपके द्वारा दिए गए नामकरण पैटर्न में वृद्धिशील संख्या (1, 2, 3 और इसी तरह) को जोड़कर नाम बदलता है।

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

उम्मीद है इससे आपका काम बनेगा।


यदि आप नियमित अभिव्यक्तियों का उपयोग करने से कोई फर्क नहीं पड़ता है, तो यह फ़ंक्शन आपको फ़ाइलों का नाम बदलने में बहुत अधिक शक्ति देगा:

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

तो आपके उदाहरण में, आप कर सकते हैं (माना जाता है कि यह वर्तमान निर्देशिका है जहां फाइलें हैं):

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

लेकिन आप प्रारंभिक फ़ाइल नामों पर भी वापस रोल कर सकते हैं:

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

और अधिक।


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 




batch-rename