Python:windows文件夹中的简单批量重命名文件

Python:windows文件夹中的简单批量重命名文件,python,windows,rename,Python,Windows,Rename,尝试创建一个简单的代码,在windows中批量重命名文件夹 必须: 更改每个数字,如“file02.txt”,将02变为0002 可能适用于每种文件格式,如jpg、png、txt、docx等(因为我不确定文件夹中会有什么,此代码可能用于图像序列…) 这可能吗 我做过测试版本,结合了我所掌握的一点知识,但这让我感到困惑 到目前为止,我的代码是: import os import sys folder_path = os.listdir(raw_input("Insert folder pa

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

必须:

  • 更改每个数字,如“file02.txt”,将02变为0002

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

这可能吗

我做过测试版本,结合了我所掌握的一点知识,但这让我感到困惑

到目前为止,我的代码是:

import os
import sys


folder_path = os.listdir(raw_input("Insert folder path: "))
print "Files in folder: %s" % folder_path

# 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

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



for current_file_n in folder_path:
    new = new_filename(current_file_n)
    print list([new]) # trying to make the str into a list....


re_name = os.renames(current_file_n, new)
print re_name
print "Renamed files: %s" % folder_path
所需的结果与开始列表相同,但用零进行比较,如:['file0001.txt','file0002.txt','file0003.txt'..'file0015.txt']

我有一些错误,比如windows错误:找不到文件,以及另一个错误;无法连接str和list


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

正如martineau所说,你的缩进有问题

以下是工作代码:

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

希望这对你有所帮助,因为马蒂诺说你的缩进有问题

以下是工作代码:

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

希望这有帮助

使用正则表达式替换可以大大简化代码。可以采取更换功能。在本例中,将前导零添加到文件名中找到的第一个数字

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作为替换参数

返回通过替换最左边的非重叠字符串获得的字符串 替换repl在字符串中出现的模式。答复 可以是字符串,也可以是可调用的;如果是字符串,则会转义反斜杠 在它里面进行加工。如果它是可调用的,它就通过了比赛 对象,并且必须返回要使用的替换字符串

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


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

使用正则表达式替换可以大大简化代码。可以采取更换功能。在本例中,将前导零添加到文件名中找到的第一个数字

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作为替换参数

返回通过替换最左边的非重叠字符串获得的字符串 替换repl在字符串中出现的模式。答复 可以是字符串,也可以是可调用的;如果是字符串,则会转义反斜杠 在它里面进行加工。如果它是可调用的,它就通过了比赛 对象,并且必须返回要使用的替换字符串

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



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

一个看起来错误的地方是,您的
new_filename()
函数没有显式返回任何内容,因此有效地返回
None
,并且随后的缩进也会出错。这将在直接或间接使用其返回值的地方导致进一步的错误。由于代码中混合使用了制表符和空格,因此缩进看起来很混乱。最好只使用空格(或将编辑器配置为自动用空格替换制表符)。@martineau谢谢,我没有意识到空格和制表符可能是一个问题一个看起来错误的地方是你的
new_filename()
函数不显式返回任何内容,因此有效地返回
None
,并且随后的缩进会出错。这将在直接或间接使用其返回值的地方导致进一步的错误。由于代码中混合使用了制表符和空格,因此缩进看起来很混乱。最好只使用空格(或将编辑器配置为自动用空格替换选项卡)。@martineau谢谢,我没有意识到空格和选项卡可能是一个问题。你应该知道这可能会覆盖文件。例如:如果您有三个文件
image1.jpg
image01.jpg
image0001.jpg
,则在运行函数后只剩下其中一个文件。您可以检查这是否即将发生,在执行操作系统之前,可能会中止或请求确认。重命名(文件名,新名称)Chrisy正在使用Windows,在Windows中,
os.rename
如果目标名称已存在,则会引发一个
OSError
。这并不一定会改变你的建议,但上下文是不同的。考虑到竞争线程和进程的竞争条件,您必须处理异常。@HåkenLid谢谢!它工作得很好!你能解释一下re.sub()中的步骤是如何工作的吗?当然。我添加了一个简短的解释。您应该知道这可能会覆盖文件。例如:如果您有三个文件
image1.jpg
image01.jpg
image0001.jpg
,则在运行函数后只剩下其中一个文件。您可以检查这是否即将发生,在执行操作系统之前,可能会中止或请求确认。重命名(文件名,新名称)Chrisy正在使用Windows,在Windows中,
os.rename
如果目标名称已存在,则会引发一个
OSError
。这并不一定会改变你的建议,但上下文是不同的。考虑到竞争线程和进程的竞争条件,您必须处理异常。@HåkenLid谢谢!它工作得很好!你能解释一下re.sub()中的步骤是如何工作的吗?当然。我已经添加了一个简短的解释。@Chrisy:您需要更精确,并指定确切的错误和显示的任何错误消息。@martineau是的,这不是一个很大的错误,而是错误消息:“重命名im0004.jpg时出现意外错误:”在所有文件的行中,那么就没有重命名的结果了…@Chrisy:Ahh…我怀疑这个错误是因为脚本没有检查t