1 回答
TA贡献1848条经验 获得超6个赞
至少有五个问题:
处理 Unicode 时,请在任何地方使用它。
os.walk
如果传递 Unicode 路径,将返回 Unicode 文件名。from __future__ import unicode_literals
将默认字符串为 Unicode。打开文件时,关闭它们。稍后重命名时会遇到问题。
result
仍然存在并引用了上次打开的文件。正如评论中提到的,在名称和名称之前和之后都使用
os.path.join
onroot
和 thefile
。os.walk
与 一起使用topdown=False
。这首先会处理叶节点,所以目录树没有被破坏(并保持root
和dirs
有效),而穿越它。首先重命名文件,然后重命名目录,以免在遍历目录树时损坏目录树。
结果:
from __future__ import unicode_literals
# Skipping unchanged code...
for root, dirs, files in os.walk('./input_folder'):
for dir in dirs:
# One way to ensure the file is closed.
with open(os.path.join(root,dir) + '/ABC ' + str(random.randint(100,999)) + '.dat','w'):
pass
with open(os.path.join(root,dir) + '/XYZ-ABC ' + str(random.randint(100,999)) + '.dat','w'):
pass
#--------------------------------------
# Main rename code
for root, dirs, files in os.walk('./input_folder',topdown=False):
for file in files:
if file.endswith((".dat")):
# Generate the full file path names.
filename1 = os.path.join(root,file)
filename2 = os.path.join(root,file.replace('ABC', '\u2714'))
os.rename(filename1,filename2)
for d in dirs:
# Generate the full directory path names.
dirname1 = os.path.join(root,d)
dirname2 = os.path.join(root,d.replace('ABC', '\u2714'))
os.rename(dirname1,dirname2)
添加回答
举报