繁体   English   中英

Python:Windows文件夹中的简单批处理重命名文件

[英]Python: simple batch rename files in windows folder

尝试创建简单的代码,以在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

希望这可以帮助

使用正则表达式替换可以大大简化您的代码。 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可以是字符串,也可以是可调用的; 如果是字符串,则处理其中的反斜杠转义。 如果它是可调用的,则将其传递给match对象,并且必须返回要使用的替换字符串。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM