Python - 根据子文件夹和文件名重命名子文件夹中的文件II
此问题是此后的后续处理:Python - rename files in subfolders based on subfolder and file name。Python - 根据子文件夹和文件名重命名子文件夹中的文件II
我试图循环访问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命令返回此错误:
"must be string, not list."
这似乎是由于我在os.rename命令使用“文件名”的。从我读过的,os.rename的第一个参数应该是旧的文件名。当我运行“打印文件名”时,它确实返回了给定子文件夹中所有文件的列表,所以这个错误是有道理的。我似乎无法弄清楚如何一次抓取一个旧文件名。
我也尝试过这些,但每次返回了一个错误:
os.rename(os.path.join(root, filename),"My_"+last+"_"+i[0]+"_"+root.split("/")[-1]+"."+i[1])
Error: Returns the folder where python is installed and an error about a string as left operand.
os.rename(root + os.sep + filename,"My_"+last+"_"+i[0]+"_"+root.split("/")[-1]+"."+i[1])
Error: cannot concatenate 'str' amd 'list' objects
我已经走遍了文档和很多帖子,但无法弄清楚什么我失踪。感谢您的任何帮助。
您正试图传递一个文件名列表来重命名命令。您将获得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]))
让我接近。 'print os.path.join(root,filename)'一次返回一个文件,例如'C:/ temp/01142014 \ VA1122F.A14'(最后一个“\”是否应该是“/”?)。 另外,当我使用'os.walk('/ tmp /')'什么都没有执行。所以我使用了最初的'os.walk(路径)'。' 但是,现在我得到了“访问被拒绝错误”。我在具有管理员权限的计算机上对此进行测试;但是,我将在我的工作计算机上执行此操作,因为我不允许拥有管理员权限。这基本上是一个表演塞? – Larry
我应该补充一点,我可以用os.rename重命名文件而不会出现访问被拒绝错误。因此,也许这不是管理员权限问题(或者os.walk(路径)也可以这样做)。例如,我可以使用此代码重命名文件,而不会出现任何错误:'begin program。 import os rdir ='c :/ temp/01142014 /' for num,fil in enumerate([fil for os.listdir(rdir)if fil.endswith('。B14')]): os.rename(rdir + fil,rdir + 'My_'+ fil) 结束程序。' – Larry
是的,它必须是'路径'。正在我的机器上测试。 –
作为一个提示,你应该像'print type(filename)'那样做一个'print'语句。我敢打赌,这不会回来'串'... – Matt