尝试创建一个简单的代码,批量重命名Windows中的文件夹。
务必:
更改每个号码,例如“file02.txt”,将02变为0002
可能适用于每种文件格式,例如jpg,png,txt,docx等等(因为我不确定文件夹中会包含什么,此代码可能用于图像序列...)
这可能吗?
我做了测试版本,结合了我所掌握的一点点知识,但它让我很困惑。
到目前为止我的代码:
baz
期望的结果与开始列表相同,但是用零进行整理,如下所示:['file0001.txt','file0002.txt','file0003.txt'......'file0015.txt “]
我遇到了像windows错误的错误:无法找到文件,还有其他错误;无法连接str和list?
我需要尽可能简单地解释我做错了什么,或者是否有其他方法可以让我得到理想的结果?
答案 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”。