这个问题是对这篇文章的后续跟进:Python - rename files in subfolders based on subfolder and file name。
我正在尝试遍历C:\temp\
内的子文件夹中的文件,并以指定的方式重命名每个文件。以下是我到目前为止的代码:
begin program.
import os
path = "C:/temp/"
for root,dirname,filename in os.walk(path):
for i in filename:
i = i.split(".")
first = i[1][0]
last = i[0][-1]
#print filename
print "My_"+last+"_"+i[0]+"_"+root.split("/")[-1]+"."+i[1]
os.rename(filename,"My_"+last+"_"+i[0]+"_"+root.split("/")[-1]+"."+i[1])
end program.
当我运行该行print "My_"+last+"_"+i ...
时,它会正确显示VA1122F.A14
中保存的名为C:\temp\11182014\
的文件将被重命名
My_F_VA1122F_11182014.A14
。
但是,os.rename命令会返回此错误:
"必须是字符串,而不是列表。"
这似乎是由于我使用" filename"在os.rename命令中。根据我的阅读,os.rename的第一个参数应该是旧文件名。当我运行"打印文件名时,"它确实返回给定子文件夹中所有文件的列表,因此该错误是有意义的。我似乎无法弄清楚如何一次抓取一个旧文件名。
我也尝试了这些,但每个都返回了一个错误:
os.rename(os.path.join(root, filename),"My_"+last+"_"+i[0]+"_"+root.split("/")[-1]+"."+i[1])
错误:返回安装python的文件夹和错误 一个字符串作为左操作数。
os.rename(root + os.sep + filename,"My_"+last+"_"+i[0]+"_"+root.split("/")[-1]+"."+i[1])
错误:无法连接' str' amd' list'对象
我已经搜索了文档和许多帖子,但无法弄清楚我错过了什么。谢谢你的帮助。
答案 0 :(得分:2)
您正在尝试传递文件名列表以重命名命令。您将在innerloop中获得单个文件名
for root,dirname,filenames in os.walk(path): for filename in filenames: i = filename.split(".")
你可以使用
os.rename(os.path.join(root, filename),"My_"+last+"_"+i[0]+"_"+root.split("/")[-1]+"."+i[1])
PS:强烈建议不要使用'+'连接字符串,因此最好使用字符串格式。
os.rename(os.path.join(root, filename),"My_{last}_{start}_{sub_fold}.{ext}".format(last=last, start=i[0], sub_fold=root.split("/")[-1], ext=i[1]))