Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将文件重命名为具有正确数字的增量值_Python_Windows_Powershell_Rename - Fatal编程技术网

Python 将文件重命名为具有正确数字的增量值

Python 将文件重命名为具有正确数字的增量值,python,windows,powershell,rename,Python,Windows,Powershell,Rename,我想根据根名称作为目录名来重命名图片列表(本例中为图片),方法是根据文件总数和增量,用适当的零填充之前的编号。我正在考虑使用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.

我想根据根名称作为目录名来重命名图片列表(本例中为图片),方法是根据文件总数和增量,用适当的零填充之前的编号。我正在考虑使用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))
    )
$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
  • pad
    使用文件计数
    len(文件路径列表)
    计算:

  • 'picture{:>0{}}.jpg'。格式(99,3)
    类似于
    'picture{:>03}.jpg'。格式(99)
    。格式化字符串
    {:>03}
    zero pad(
    0
    ),右对齐(
    )输入值(
    99
    ,在下面的示例中)

所用功能的文档:

    • 假设

    • 您已经知道如何遍历目录
    • 访问脚本中的文件名
    • 重命名文件
    • 有几件事需要了解

    • 如果文件名小于某个大小,则文件名的格式为数字加上“0”,在您的示例中,如果文件名小于3,则文件名的格式为数字加上“0”
      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解决方案:

      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))
          )
      
      $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
      参数以实际执行重命名。

      我建议您使用python或powershell。如果你有一些代码,我可能也能帮你。也许值得解释一下
      'picture{:>0{}}.jpg'.format(n,pad)
      是如何工作的。