我想根据作为目录名称的根名称重命名图片列表(本示例中的图片),方法是根据文件总数和增量用适当的零填充先前的编号。我正在考虑使用 Powershell 或 Python。建议?
当前 'C:\picture' 目录内容
pic 1.jpg
...
pic 101.jpg
结果
picture 001.jpg
...
picture 101.jpg
我想根据作为目录名称的根名称重命名图片列表(本示例中的图片),方法是根据文件总数和增量用适当的零填充先前的编号。我正在考虑使用 Powershell 或 Python。建议?
当前 'C:\picture' 目录内容
pic 1.jpg
...
pic 101.jpg
结果
picture 001.jpg
...
picture 101.jpg
这是python解决方案:
import glob
import os
dirpath = r'c:\picture'
dirname = os.path.basename(dirpath)
filepath_list = glob.glob(os.path.join(dirpath, 'pic *.jpg'))
pad = len(str(len(filepath_list)))
for n, filepath in enumerate(filepath_list, 1):
os.rename(
filepath,
os.path.join(dirpath, 'picture {:>0{}}.jpg'.format(n, pad))
)
pad
使用文件计数计算len(filepath_list)
:
>>> len(str(100)) # if file count is 100
3
'picture {:>0{}}.jpg'.format(99, 3)
就像'picture {:>03}.jpg'.format(99)
。格式化字符串{:>03}
zero-pad( 0
),右对齐 ( >
) 输入值(99
在以下示例中)。
>>> 'picture {:>0{}}.jpg'.format(99, 3)
'picture 099.jpg'
>>> 'picture {:>03}.jpg'.format(99)
'picture 099.jpg'
所用函数的文档:
假设
需要理解的几件事
str.format
,提供了一个精心制作的格式字符串说明符来实现这一点演示
>>> no_of_files = 100
>>> no_of_digits = int(math.log10(no_of_files)) + 1
>>> format_exp = "pictures {{:>0{}}}.{{}}".format(no_of_digits)
>>> for fname in files:
#Discard the irrelevant portion
fname = fname.rsplit()[-1]
print format_exp.format(*fname.split('.'))
pictures 001.jpg
pictures 002.jpg
pictures 010.jpg
pictures 100.jpg
这是一个 PowerShell 解决方案:
$jpgs = Get-ChildItem C:\Picture\*.jpg
$numDigits = "$($jpgs.Length)".Length
$formatStr = "{0:$('0' * $numDigits)}"
$jpgs | Where {$_.BaseName -match '(\d+)'} |
Rename-Item -NewName {$_.DirectoryName + '\' + $_.Directory.Name + ($formatStr -f [int]$matches[1]) + $_.Extension} -WhatIf
-WhatIf
如果您获得的预览-WhatIf
看起来不错,请删除参数以实际执行重命名。