[英]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.