【问题标题】:Renaming multiple files in a directory using Python使用 Python 重命名目录中的多个文件
【发布时间】:2016-09-24 20:29:29
【问题描述】:

我正在尝试使用此 Python 脚本重命名目录中的多个文件:

import os
path = '/Users/myName/Desktop/directory'
files = os.listdir(path)
i = 1

for file in files:
    os.rename(file, str(i)+'.jpg')
    i = i+1

当我运行此脚本时,我收到以下错误:

Traceback (most recent call last):
  File "rename.py", line 7, in <module>
    os.rename(file, str(i)+'.jpg')
OSError: [Errno 2] No such file or directory

这是为什么呢?我该如何解决这个问题?

谢谢。

【问题讨论】:

  • 你必须指定整个路径。
  • 您的files 列表将包含给定path 中的所有文件,但是当您执行os.rename() 时,它会在当前工作目录中查找文件。
  • os.listdir() 只返回文件名,而不是文件的完整路径。使用os.path.join(path, file) 获取完整路径并重命名。

标签: python directory rename


【解决方案1】:

重命名时你没有给出整个路径,这样做:

import os
path = '/Users/myName/Desktop/directory'
files = os.listdir(path)


for index, file in enumerate(files):
    os.rename(os.path.join(path, file), os.path.join(path, ''.join([str(index), '.jpg'])))

编辑:感谢 tavo,第一个解决方案是将文件移动到当前目录,解决了这个问题。

【讨论】:

  • 请注意,这也会将文件移动到当前目录。为避免这种情况,请改为使用os.rename(os.path.join(path, file), os.path.join(path, str(i)+'.jpg'))
  • 还要注意join方法。您的代码返回TypeError: join() takes exactly one argument (2 given)!为避免这种情况,只需将代码的最后一行替换为以下行:os.rename(os.path.join(path, file), os.path.join(path, ''.join([str(index), '.jpg'])))
  • 谢谢@JaroslavBezděk
【解决方案2】:

您必须先将此路径设为当前工作目录。 很简单。 其余代码没有错误。

使其成为当前工作目录:

os.chdir(path)

【讨论】:

    【解决方案3】:
    import os
    from os import path
    import shutil
    
    Source_Path = 'E:\Binayak\deep_learning\Datasets\Class_2'
    Destination = 'E:\Binayak\deep_learning\Datasets\Class_2_Dest'
    #dst_folder = os.mkdir(Destination)
    
    
    def main():
        for count, filename in enumerate(os.listdir(Source_Path)):
            dst =  "Class_2_" + str(count) + ".jpg"
    
            # rename all the files
            os.rename(os.path.join(Source_Path, filename),  os.path.join(Destination, dst))
    
    
    # Driver Code
    if __name__ == '__main__':
        main()
    

    【讨论】:

      【解决方案4】:

      根据@daniel 的评论,os.listdir() 只返回文件名,而不是文件的完整路径。使用 os.path.join(path, file) 获取完整路径并重命名。

      import os
      path = 'C:\\Users\\Admin\\Desktop\\Jayesh'
      files = os.listdir(path)
      for file in files:
         os.rename(os.path.join(path, file), os.path.join(path, 'xyz_' + file + '.csv'))
      

      【讨论】:

      • 请详细说明如何更好地解决此问题以及如何扩展之前的答案。
      【解决方案5】:

      只需使用已接受的答案定义路径变量和列表:

      path = "/Your/path/to/folder/"
      files = os.listdir(path)
      

      然后遍历该列表:

      for index, file in enumerate(files):
          #print (file)
          os.rename(path+file, path +'file_' + str(index)+ '.jpg')
      

      或以与 python 列表理解相同的方式循环:

      [os.rename(path+file, path +'jog_' + str(index)+ '.jpg')  for index, file in enumerate(files)]
      

      我认为第一个更具可读性,第二个循环的第一部分只是列表理解的第二部分

      【讨论】:

        【解决方案6】:

        如果您的文件以随机方式重命名,那么您必须先对目录中的文件进行排序。给定的代码首先排序然后重命名文件。

        import os
        import re
        path = 'target_folder_directory'
        files = os.listdir(path)
        files.sort(key=lambda var:[int(x) if x.isdigit() else x for x in re.findall(r'[^0-9]|[0-9]+', var)])
        for i, file in enumerate(files):
            os.rename(path + file, path + "{}".format(i)+".jpg")
        

        【讨论】:

          【解决方案7】:

          如果您想要一个可行的解决方案而不需要重新发明轮子,我编写了一个快速灵活的文件重命名脚本。

          它通过传递replacement functions重命名当前目录中的文件。

          每个函数都指定您要对所有匹配的文件名进行的更改。该代码将确定将要进行的更改,并使用颜色显示它会产生的差异,并要求确认以执行更改。

          您可以在这里找到源代码,并将其放在您要重命名文件的文件夹https://gist.github.com/aljgom/81e8e4ca9584b481523271b8725448b8

          它在pycharm中有效,我还没有在其他控制台上测试过

          在定义了一些替换函数之后,交互看起来像这样

          当它运行第一个时,它会显示与目录中匹配的文件的所有差异,您可以确认是否进行替换,像这样

          【讨论】:

          • 谢谢,效果很好!更好的用法说明会有所帮助,可以使用 3 行函数和 rename_files.py confirm_and_rename 函数移动和重命名目录。
          【解决方案8】:

          这对我有用,通过将索引增加 1,我们可以对数据集进行编号。

          import os  
               
          path = '/Users/myName/Desktop/directory'
          files = os.listdir(path)
          index=1
                  
          for index, file in enumerate(files):
               os.rename(os.path.join(path, file),os.path.join(path,''.join([str(index),'.jpg'])))
               index = index+1
          

          但如果您当前的图片名称以数字开头,这将不起作用。

          【讨论】:

            猜你喜欢
            • 2011-02-15
            • 2018-11-01
            • 1970-01-01
            • 2012-12-27
            • 2021-03-28
            • 2020-07-25
            • 2018-08-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多