Python:在Windows文件夹中简单批量重命名文件

时间:2016-01-30 21:47:21

标签: python windows rename

尝试创建一个简单的代码,批量重命名Windows中的文件夹。

务必:

  • 更改每个号码,例如“file02.txt”,将02变为0002

  • 可能适用于每种文件格式,例如jpg,png,txt,docx等等(因为我不确定文件夹中会包含什么,此代码可能用于图像序列...)

这可能吗?

我做了测试版本,结合了我所掌握的一点点知识,但它让我很困惑。

到目前为止我的代码:

baz

期望的结果与开始列表相同,但是用零进行整理,如下所示:['file0001.txt','file0002.txt','file0003.txt'......'file0015.txt “]

我遇到了像windows错误的错误:无法找到文件,还有其他错误;无法连接str和list?

我需要尽可能简单地解释我做错了什么,或者是否有其他方法可以让我得到理想的结果?

2 个答案:

答案 0 :(得分:1)

正如马蒂诺所说,你的缩进搞砸了。

这是工作代码:

import os
import sys

# a split tool
def mysplit(s):
    head = s.rstrip('0123456789')
    tail = s[len(head):]
    return head, tail

# a function to make a new name with needed 0000
def new_filename(filename):
    file_name_part, ext = os.path.splitext(filename) #  file01 and .ext

    original_name, number = mysplit(file_name_part) # 01 and file
    add_zero = number.rjust(4, "0") # add 0001

    new_name = original_name + add_zero + ext

    return new_name
    # new_name  comes like this ['file0001.txt'] but seperate, not in a list? Why?

if __name__ == '__main__':
     folder_path = os.listdir(raw_input("Insert folder path: "))
     print "Files in folder: %s" % folder_path
     renamed_files = [] 
     for current_file_n in folder_path:
          new = new_filename(current_file_n)
          renamed_files.append(new) # Add renamed file's name to a list
          try:
               os.renames(current_file_n, new) #It doesn't return anything
               print new
          except:
               print "Unexpected error while renaming %s:%s"%(new, sys.exc_info()[0])
     print "Renamed files: %s" % renamed_files

希望这有帮助

答案 1 :(得分:1)

使用正则表达式替换可以大大简化您的代码。 re.sub()可以使用替换功能。在这种情况下,将前导零添加到文件名中找到的第一个数字。

import os, re

def renumber_files(directory, zeroes=4):
    os.chdir(directory)
    for filename in os.listdir(directory):
        new_name = re.sub(r'\d+', lambda m: m.group().zfill(zeroes), filename, count=1)
        os.rename(filename, new_name)


renumber_files(raw_input("Insert folder path: "))

这是有效的,因为re.sub()可以将callable作为替换参数。

Signature: re.sub(pattern, repl, string, count=0, flags=0) 
     

返回通过替换最左边的非重叠获得的字符串   替换repl在字符串中出现模式。 REPL   可以是字符串也可以是可调用的;如果一个字符串,反斜杠逃脱   在它处理。如果它是可调用的,则传递匹配   object,必须返回要使用的替换字符串。

在lambda m.group()中返回与模式\d+匹配的字符串。例如“1”,“564645”或“005”。

下一步str.zfill(4)将其转换为“0001”,“564645”或“0005”。