问题描述
(使用2.7)
当前有问题,我一直在尝试执行os.walk / os.rename的过程。 但是目前,只有主文件被附加_final,而不是该文件中的所有文件。
所以举个例子
主--> sub1-> sub2-> sub3
需要是
Main_final(当前在此处停止)----> sub1_final-> sub2_final-> sub3_final
这是我目前的代码,
import shutil
import sys
import os
def rename():
### pseudo
for folderName, subfolders, filenames in os.walk(path, topdown=##???):
for subfolder in subfolders:
print subfolder
os.rename(os.path.join(folderName, subfolders), os.path.join(folderName, subfolders + 'rename'))
print('')
else:
print("Directory does not exist")
if __name__ == '__main__':
copy()
1楼
在topdown设置为False的树上移动-首先重命名子目录,最后重命名顶层目录,重命名顶层目录将不再影响子目录。
从
如果可选参数topdown为True或未指定,则将在其任何子目录的三元组之前生成目录的三元组(目录是自上而下生成的)。 如果topdown为False,则在其所有子目录的三元组之后生成目录的三元组(目录是自下而上生成的)。 无论topdown的值如何,都将在生成目录及其子目录的元组之前检索子目录的列表。
当topdown为True时,调用者可以就地修改目录名称列表(也许使用del或slice分配),而walk()将仅递归到其名称仍保留在目录名称中的子目录中。 这可用于修剪搜索,强加特定的访问顺序,甚至可在调用者再次恢复walk()之前向walk()告知调用者创建或重命名的目录。 当topdown为False时修改目录名对走动的行为没有影响,因为在自下而上模式下,目录名中的目录是在生成目录路径本身之前生成的。
import os
path = "path/to/folder"
for root, dirs, files in os.walk(path, topdown=False):
for dirname in dirs:
print os.path.join(root, dirname)
os.rename(os.path.join(root, dirname), os.path.join(root, dirname+"_Final"))
2楼
os.walk(fc)
返回一个生成器对象,因此,如果您在遍历或迭代期间编辑条目,则os.walk
混淆(它使用dfs遍历算法,因此先前的堆栈条目不再存在),因此引发StopIteration
您需要首先获取所有条目并按最深条目的顺序重命名文件。
import shutil
import sys
import os
from operator import itemgetter
def copy():
print("copy program")
set_path = "D:\\test\\test1"
os.chdir(set_path)
if os.path.exists(set_path):
fc ='D:\\test\\test1\\final'
working = '_final'
shutil.copytree(set_path, fc)
os.chdir(fc)
stack = [0]
entries = []
for folder, subfolders, files in os.walk(fc):
lev = stack.pop()
for subfolder in subfolders:
entries.append((os.path.join(folder, subfolder), lev + 1))
for file in files:
entries.append((os.path.join(folder, file), lev + 1))
stack.extend([lev + 1]*len(subfolders))
for fpath in map(itemgetter(0), sorted(entries, key=lambda x: -x[1])):
os.rename(fpath, fpath + working)
else:
print("Directory does not exist")
if __name__ == '__main__':
copy()
它在我的系统上工作