जवाबों:
इस तरह के नामकरण काफी आसान है, उदाहरण के लिए ओएस और ग्लोब मॉड्यूल के साथ:
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
[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')]
rename
:(
no such file error
याद है तो आपको os.rename
पूरा रास्ता चाहिए
यदि आप नियमित अभिव्यक्तियों का उपयोग करने में कोई आपत्ति नहीं करते हैं, तो यह फ़ंक्शन आपको फ़ाइलों का नाम बदलने में बहुत शक्ति देगा:
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")
और अधिक।
मेरे पास फ़ोल्डर के सबफ़ोल्डर में सभी फ़ाइलों का नाम बदलने के लिए है
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 द्वारा सभी घटनाओं की जगह ले रहा हूं।
कोशिश करें: http://www.mattweber.org/2007/03/04/python-script-renamepy/
मुझे अपना संगीत, मूवी और चित्र फ़ाइलों को एक निश्चित तरीके से नाम देना पसंद है। जब मैं इंटरनेट से फाइलें डाउनलोड करता हूं, तो वे आमतौर पर मेरे नामकरण सम्मेलन का पालन नहीं करते हैं। मैंने अपने आप को अपनी शैली में फिट करने के लिए प्रत्येक फ़ाइल का नाम बदलकर स्वयं पाया। यह बहुत तेजी से पुराना हो गया, इसलिए मैंने इसे मेरे लिए करने के लिए एक कार्यक्रम लिखने का फैसला किया।
यह कार्यक्रम फ़ाइल नाम को सभी लोअरकेस में बदल सकता है, फ़ाइल नाम में स्ट्रिंग्स को प्रतिस्थापित कर सकता है जो आप चाहते हैं, और फ़ाइल नाम के आगे या पीछे से किसी भी वर्ण को ट्रिम करें।
कार्यक्रम का स्रोत कोड भी उपलब्ध है।
मैंने अपने आप पर एक अजगर स्क्रिप्ट लिखी है। यह उस तर्क के मार्ग के रूप में लेता है जिसमें फाइलें मौजूद हैं और नामकरण पैटर्न जिसे आप उपयोग करना चाहते हैं। हालाँकि, यह आपके द्वारा दिए गए नामकरण पैटर्न में एक वृद्धिशील संख्या (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 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)
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
मुझे एक समान समस्या थी, लेकिन मैं एक निर्देशिका में सभी फ़ाइलों के फ़ाइल नाम की शुरुआत में पाठ जोड़ना चाहता था और एक समान विधि का उपयोग करता था। नीचे उदाहरण देखें:
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.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
(mys own answer) https://stackoverflow.com/a/45734381/6329006
# 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
यदि आप किसी संपादक में फ़ाइल नामों को संशोधित करना चाहते हैं (जैसे vim), तो क्लिक लाइब्रेरी कमांड के साथ आती है 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])
मैंने एक कमांड लाइन एप्लिकेशन लिखा था जो एक ही तकनीक का उपयोग करता है, लेकिन यह इस स्क्रिप्ट की अस्थिरता को कम करता है, और अधिक विकल्प जैसे पुनरावर्ती रिफैक्टरिंग के साथ आता है। यहाँ github पेज का लिंक दिया गया है । यह उपयोगी है यदि आप कमांड लाइन अनुप्रयोगों को पसंद करते हैं, और नाम दर्ज करने के लिए कुछ त्वरित संपादन करने में रुचि रखते हैं। (मेरा आवेदन रेंजर में पाए जाने वाले "बल्क्रेन" कमांड के समान है )।
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
%
कमांड में प्रतीक का उपयोग कैसे किया जाता हैos.path.join(dir, titlePattern % title + ext)
? मुझे पता%
है कि मोडुलो ऑपरेशन के लिए है और इसका उपयोग प्रारूपण ऑपरेटर के रूप में भी किया जाता है। लेकिन आमतौर पर यह प्रारूप को निर्दिष्ट करने के लिएs
या उसके बाद होता हैf
।%
उक्त आदेश के तुरंत बाद कुछ भी (स्थान) क्यों नहीं है ?