2012-08-27 58 views
1

因此,我对Python相当陌生,并且已经搜索了Web和堆栈溢出以获得简单的解决方案。我确信有一个我遇到的解决方案可以工作。然而,我很难将其他人的解决方案应用到我所需要的环境中。将模板文件复制到多个目录中,根据目录查询重命名的模板文件

我有一个模板文件,我已经设法复制到我的“projStorage”变量的多个子目录。

e.g

+ proj\Storage\dir 
    + Seq1 
     + template.file >> which I want to rename to >> Seq1_stringHere.File 
    + Seq2 
     + template.file >> Seq2_stringHere.File 
    + Seq3 
     + template.file >> Seq3_stringHere.File 

的问题是,我想基础上,他们刚刚被复制到该目录重命名我的模板文件。要做到这一点,我做了一个os.listdir(seqFileList),我希望能够返回一个列表与每个模板文件,所以我可以重命名为Seq目录名称+字符串格式。

我已经做了这个使用for循环。现在我明白我的'seqFileList'正在为proj \ Storage \ Dir中的每个文件夹做一个listdir(),并且正在返回我的文件列表。 我已经看到'扁平化列表'的解决方案,但我不完全理解这是如何工作的。 印刷seqFileList返回类似,

['Template.file'] 
['Template.file'] 
['Template.file'] 

当我要的是

['Template.file','Template.file','Template.file',] 

,所以我可以重命名为

['Seq01_strHere.File','Seq02_strHere.File','Seq03_strHere.File',] 

而且我知道代码的重命名部分尚未实施,因为我不确定如何去做。我知道一个解决方案是os.rename(),但我不确定在哪里正确实现。

我知道这个问题可能并不新鲜,对于一些人来说会非常简单。我不是想成为一名“帮助吸血鬼”,因为我真的试图为自己内化这些东西。所以请原谅我的新鲜感。 任何和所有的解决方案,赞赏。

为了清楚起见,我已经替换了文件路径和项目名称。

在此先感谢。

import os, shutil 

projTemplate = 'Path\\To\\Template.file' 

projStorage = 'Proj\\Storage\\dir' 

projSeqs = os.listdir(projStorage) 

for seqs in projSeqs: 
    seqFileDir = os.path.join(projStorage, seqs)  
    shutil.copy2(projTemplate, seqFileDir)    
    seqFileList = os.listdir(seqFileDir) 

    print seqFileDir 

回答

1

为什么不在你的子文件夹中复制模板时重命名它?

for seqs in projSeqs: 
    seqFileDir = os.path.join(projStorage, seqs) 
    seqFileTemplate = os.path.join(seqFileDir, '%s_stringHere.File' % seqs) 
    shutil.copyfile(projTemplate, seqFileTemplate) 
    shutil.copystat(projTemplate, seqFileTemplate)   
+0

copystat绝对是一个额外的好处。非常感谢!很容易理解。 –

+0

我收录了它,因为我相信'shutil.copy2'做了'shutil.copy',所以我以为你一定是想要它:) –

+0

真棒,我认为这就是它做的。谢谢你澄清。 :) –

0
import os,shutil 
projTemplate = '/Path/To/Template.file' 
projStorage = '/Proj/Storage/dir' 
[shutil.copy2(projTemplate, os.path.join(projStorage,dir,dir+"_stringHere.file")) 
      for dir in os.listdir(projStorage)] 
+0

超级棒!喜欢这个敏捷。在开始分解之前,我需要一些练习。 –

+0

使用列表理解作为流量控制的手段通常在Python中被忽视,因为您正在有效地构建一个永远不会使用的列表。如果你不构建一个列表,那么列表理解不是答案,“for”循环是。如果你需要一行代码:'map(lambda x:shutil.copy2(projTemplate,x),((os.path.join(projStorage,dir,dir + _'stringHere.file'))for dir in os 。listdir(projStorage)))'(尽管如果你把它分解成部分和帮助者,它显然更好) –

+0

@Matthew,我完全同意你的看法。 for循环在这里会更清楚。由于Python是该语言,因此经过多年的Java编程后,让我在功能编程中尝到了鲜血。我无法帮助编写更多功能风格的代码(例如,列表理解over for循环)。此外,列表理解让我更愿意在稍后重构我的代码,以防需要结果并需要添加过滤器。所以我通常更喜欢循环的列表理解。 –

相关问题