2015-07-22 184 views
1

此问题是此后的后续处理:Python - rename files in subfolders based on subfolder and file namePython - 根据子文件夹和文件名重命名子文件夹中的文件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

我已经走遍了文档和很多帖子,但无法弄清楚什么我失踪。感谢您的任何帮助。

+0

作为一个提示,你应该像'print type(filename)'那样做一个'print'语句。我敢打赌,这不会回来'串'... – Matt

回答

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])) 
+0

让我接近。 'print os.path.join(root,filename)'一次返回一个文件,例如'C:/ temp/01142014 \ VA1122F.A14'(最后一个“\”是否应该是“/”?)。 另外,当我使用'os.walk('/ tmp /')'什么都没有执行。所以我使用了最初的'os.walk(路径)'。' 但是,现在我得到了“访问被拒绝错误”。我在具有管理员权限的计算机上对此进行测试;但是,我将在我的工作计算机上执行此操作,因为我不允许拥有管理员权限。这基本上是一个表演塞? – Larry

+0

我应该补充一点,我可以用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

+0

是的,它必须是'路径'。正在我的机器上测试。 –