একটি ডিরেক্টরিতে ফাইলগুলির ব্যাচ নামকরণ


102

পাইথন ব্যবহার করে ডিরেক্টরিতে ইতিমধ্যে থাকা একটি গ্রুপের ফাইলের নামকরণের কি সহজ উপায় আছে?

উদাহরণ: আমার কাছে * .ডোক ফাইল পূর্ণ একটি ডিরেক্টরি রয়েছে এবং আমি তাদের ধারাবাহিক উপায়ে নাম পরিবর্তন করতে চাই।

এক্স.ডোক -> "নতুন (এক্স)। ডক"

Y.doc -> "নতুন (Y)। ডক"

উত্তর:


114

এই জাতীয় নামকরণ করা বেশ সহজ, উদাহরণস্বরূপ ওএস এবং গ্লোব মডিউলগুলির সাথে:

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\xxdir এ রূপান্তর করবে new(%s).doc, যেখানে %sফাইলটির পূর্বের বেস নামটি (এক্সটেনশন ছাড়াই)।


1
%কমান্ডে প্রতীকটি কীভাবে ব্যবহৃত হয় os.path.join(dir, titlePattern % title + ext)? আমি জানি %মডুলো অপারেশনের জন্য এবং এটি ফর্ম্যাটিং অপারেটর হিসাবেও ব্যবহৃত হয়। তবে সাধারণত এটি ফর্ম্যাট নির্দিষ্ট করতে sবা অনুসরণ করে f%উল্লিখিত কমান্ডের সাথে সাথে কেন কিছুই (স্থান) নেই ?
শশাঙ্ক সাওয়ান্ত

3
@ শশাঙ্কসওয়ান্ট এটি সত্যই একটি ফর্ম্যাটিং অপারেটর। ডকুমেন্টেশন এবং নমুনা ব্যবহারের জন্য স্ট্রিং ফর্ম্যাটিং অপারেশনগুলি দেখুন ।
ডিজনেক্স

133

আমি আরও প্রতি জেনেরিক এবং জটিল কোড না দিয়ে প্রতিস্থাপনের জন্য ছোট ছোট একটি লাইন লিখতে পছন্দ করি। উদাহরণ:

এটি বর্তমান ডিরেক্টরিতে কোনও গোপনীয় ফাইলের হাইফেনের সাথে সমস্ত আন্ডারস্কোরকে প্রতিস্থাপন করে

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

4
অন্যান্য পদ্ধতির তুলনায় অনেক সহজ। এই কারণেই আমি পাইথনকে ভালবাসি।
ড্যান গেইল

আমার "পুনরায় নামকরণ" আদেশটি কেন কাজ করছে না - তা বোঝার চেষ্টা করে আজ অনেক সময় নষ্ট হয়েছে - প্রথমে এখানে আসা উচিত ছিল! দুর্দান্ত পাইথোনিক ওয়ান-লাইনার!
ডেভিন

কারণ উইন্ডোজ প্রতিটি পর বর্ণানুসারে করে ফাইল পুনরায় ক্রম রাখে কাজ করে না rename:(
ytpillai

4
দুর্দান্ত তবে এটি কেবল সাব দির ছাড়াই একটি ডির নিয়ে কাজ করে।
পার্বত্য

যদি আপনি no such file errorকেবল মনে os.rename
রাখেন

22

আপনি যদি নিয়মিত এক্সপ্রেশন ব্যবহার করতে আপত্তি করেন না, তবে এই ফাংশনটি আপনাকে ফাইলের নাম পরিবর্তন করে তুলতে অনেক শক্তি দেবে:

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

এবং আরও।


11

ফোল্ডারের সাবফোল্ডারগুলিতে সমস্ত ফাইলের নতুন নামকরণ করার জন্য আমার কাছে এটি রয়েছে

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

আমি পুরানো_স্ট্রি এর সমস্ত উপস্থিতি নতুন_রিস্ট দ্বারা যে কোনও ক্ষেত্রে প্রতিস্থাপন করছি।


এই কোডটি সত্যই কোনও ডিরেক্টরিতে কোনও ফাইলের শিরোনামের কোনও অংশ প্রতিস্থাপনের জন্য ব্যবহার করতে হয়।
জিওশাউন

6

চেষ্টা করুন: http://www.mattweber.org/2007/03/04/python-script-renamepy/

আমি আমার সংগীত, সিনেমা এবং ছবির ফাইলগুলির একটি নির্দিষ্ট উপায়ে নামকরণ করতে চাই। আমি যখন ইন্টারনেট থেকে ফাইলগুলি ডাউনলোড করি তখন তারা সাধারণত আমার নামকরণের কনভেনশন অনুসরণ করে না। আমি আমার শৈলীতে ফিট করার জন্য নিজে নিজে প্রতিটি ফাইলের নাম পরিবর্তন করে দেখতে পেয়েছি। এটি পুরানো বাস্তবের দ্রুত পেয়েছে, তাই আমি এটি করার জন্য একটি প্রোগ্রাম লেখার সিদ্ধান্ত নিয়েছি।

এই প্রোগ্রামটি ফাইলের নামটি সমস্ত ছোট হাতের মধ্যে রূপান্তর করতে পারে, আপনি যা চান তার সাথে ফাইলনেমগুলিতে স্ট্রিং প্রতিস্থাপন করতে পারে এবং ফাইলের সামনে বা পিছন থেকে যে কোনও সংখ্যক অক্ষর ছাঁটাতে পারে।

প্রোগ্রামটির উত্স কোডটি উপলব্ধ।


1
দুর্ভাগ্যক্রমে লিঙ্কটি নষ্ট হয়ে গেছে, সোর্স কোডটি কোথায় রয়েছে তা কি কেউ জানেন?
ryanpcmcquen

6

আমি নিজে থেকে একটি অজগর স্ক্রিপ্ট লিখেছি। এটি আর্গুমেন্ট হিসাবে যে ডিরেক্টরিতে ফাইল উপস্থিত থাকে এবং যে নামকরণ প্যাটার্নটি আপনি ব্যবহার করতে চান তা লাগে। তবে এটি আপনার দেওয়া নামকরণের ধরণীতে একটি বর্ধিত সংখ্যা (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

আশা করি এটি আপনার পক্ষে কাজ করে।


5

আপনার যে নাম পরিবর্তন করতে হবে সেই ডিরেক্টরিতে থাকুন।

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

"ডিরেক্টরিতে থাকতে ..." ব্যবহার করতেos.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

আমার একই রকম সমস্যা ছিল, তবে আমি একটি ডিরেক্টরিতে সমস্ত ফাইলের ফাইলের নামের শুরুতে পাঠ্য যুক্ত করতে চেয়েছিলাম এবং অনুরূপ পদ্ধতিটি ব্যবহার করেছি। নীচে উদাহরণ দেখুন:

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

আমার ডিরেক্টরিতে আমার একাধিক সাবডির রয়েছে, প্রতিটি সাবডিরের প্রচুর চিত্র রয়েছে আমি সমস্ত সাবডির চিত্রগুলি 1.jpg p 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://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

আপনি যদি কোনও সম্পাদক (যেমন ভিআইএম) তে ফাইলের নাম পরিবর্তন করতে চান তবে ক্লিক লাইব্রেরি কমান্ড সহ আসে click.edit(), যা সম্পাদক থেকে ব্যবহারকারী ইনপুট গ্রহণ করতে ব্যবহার করা যেতে পারে। এটি একটি ডিরেক্টরিতে ফাইলগুলি রিফেক্টর ব্যবহার করতে কীভাবে ব্যবহার করা যায় তার একটি উদাহরণ এখানে।

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

আমি একটি কমান্ড লাইন অ্যাপ্লিকেশন লিখেছিলাম যা একই কৌশল ব্যবহার করে, তবে এটি এই স্ক্রিপ্টের অস্থিরতা হ্রাস করে এবং আরও বিকল্পগুলির সাথে আসে, যেমন পুনরাবৃত্তিক রিফ্যাক্টরিং। গিথুব পৃষ্ঠার লিঙ্কটি এখানে । আপনি যদি কমান্ড লাইন অ্যাপ্লিকেশন পছন্দ করেন এবং নাম ফাইল করার জন্য কিছু দ্রুত সম্পাদনা করতে আগ্রহী হন তবে এটি কার্যকর। (আমার অ্যাপ্লিকেশনটি রেঞ্জারে পাওয়া "বাল্করনেম" কমান্ডের অনুরূপ )।


1
আমরা বাহ্যিক সংস্থানগুলিতে লিঙ্কগুলিকে উত্সাহিত করি, আমরা লিঙ্ক-কেবল উত্তরগুলি নিরুৎসাহিত করি কারণ লিঙ্কটির মেয়াদ শেষ হওয়ার সাথে সাথে তারা অকেজো হয়ে যায়। প্রশ্নের :) উত্তর অন্তর্ভুক্ত করা আপনার প্রতিক্রিয়া আপডেট করুন
আইটি বিচ্যুত

একেবারে। আমি আমার পোস্ট সম্পাদনা করব। এটি আমার প্রথম অবদান তাই আমি নির্দেশনার প্রশংসা করি!
জিম শ্যাডডিক্স

0

এই কোডটি কাজ করবে

ফাংশনটি হ'ল দুটি আর্গুমেন্ট এফ_প্যাথকে আপনার ফাইলের নামকরণের পথে এবং ফাইলের নতুন নাম হিসাবে নতুন নাম রাখে takes

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.