0

我想根据作为目录名称的根名称重命名图片列表(本示例中的图片),方法是根据文件总数和增量用适当的零填充先前的编号。我正在考虑使用 Powershell 或 Python。建议?

当前 'C:\picture' 目录内容

pic 1.jpg
...
pic 101.jpg

结果

picture 001.jpg
...
picture 101.jpg
4

3 回答 3

1

这是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'
    

所用函数的文档:

于 2013-10-08T03:26:19.670 回答
0

假设

  1. 你已经知道如何遍历你的目录
  2. 访问脚本中的文件名
  3. 重命名文件

需要理解的几件事

  1. 您的文件名具有数字格式,如果它小于某个大小,则用 '0' 填充,在您的示例中,如果它小于 3。str.format,提供了一个精心制作的格式字符串说明符来实现这一点
  2. 您需要知道如何根据需要重新格式化文件名的相关部分
  3. 格式最终会根据文件的数量而有所不同。

演示

>>> 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
于 2013-10-08T03:37:27.717 回答
0

这是一个 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看起来不错,请删除参数以实际执行重命名。

于 2013-10-08T04:08:03.800 回答