回答:
このような名前の変更は、たとえば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
で、はファイルの以前のベース名(拡張子なし)です。
私は、より汎用的で複雑なコードを作成するのではなく、置き換える必要がある置換ごとに小さな1ライナーを書くことを好みます。例えば:
これにより、現在のディレクトリにある隠しファイル以外のすべてのアンダースコアがハイフンに置き換えられます
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)))
old_strのすべての出現箇所を、すべてのケースをnew_strに置き換えます。
試してください:http : //www.mattweber.org/2007/03/04/python-script-renamepy/
音楽、映画、および画像ファイルに特定の名前を付けることが好きです。インターネットからファイルをダウンロードすると、通常、私の命名規則に従っていません。私は自分のスタイルに合うように手動で各ファイルの名前を変更していることに気づきました。これは本当に早く古くなったので、私はそれを行うためのプログラムを書くことにしました。
このプログラムは、ファイル名をすべて小文字に変換し、ファイル名の文字列を任意の文字列に置き換え、ファイル名の前後の任意の数の文字を削除できます。
プログラムのソースコードも入手可能です。
私は自分でpythonスクリプトを作成しました。引数として、ファイルが存在するディレクトリのパスと、使用する命名パターンを受け取ります。ただし、指定した命名パターンに増分番号(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
# 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ページへのリンクです。これは、コマンドラインアプリケーションが好きで、ファイル名をすばやく編集したい場合に便利です。(私のアプリケーションは、レンジャーにある「bulkrename」コマンドに似ています)。
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
、形式を指定します。%
上記のコマンドの直後に何もない(スペース)のはなぜですか?