【问题标题】:Copy template file to multiple directories, query template files for rename based on directory复制模板文件到多个目录,根据目录查询模板文件重命名
【发布时间】:2012-08-21 13:16:13
【问题描述】:

所以我对 Python 还很陌生,我已经搜索了网络和堆栈溢出,以获得一个简单的解决方案。我确信我遇到了一个可行的解决方案。但是,我很难将其他人的解决方案实施到我需要的环境中。

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

例如

+ 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

【问题讨论】:

    标签: python list rename


    【解决方案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)         
    

    【讨论】:

    • copystat 绝对是一个额外的好处。非常感谢!非常容易理解。
    • 我包含它是因为我相信 shutil.copy2shutil.copy 所做的事情,所以我认为你一定想要它 :)
    • 太棒了,我认为这就是它所做的。谢谢你的澄清。 :)
    【解决方案2】:
    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)]
    

    【讨论】:

    • 超级棒!喜欢这方面的速度。在我开始像这样分解它之前,我需要一些练习。
    • 在 Python 中通常不赞成使用列表推导式作为流控制的手段,因为您实际上是在构建一个从未使用过的列表。如果你没有构建一个列表,那么列表推导不是答案,for 循环是答案。如果你必须有一个单行:map(lambda x: shutil.copy2(projTemplate, x), ((os.path.join(projStorage, dir, dir+_'stringHere.file')) for dir in os.listdir(projStorage)))(虽然如果你把它分成部分和助手显然更好)
    • @Matthew,我完全同意你的看法。这里的 for 循环会更清楚。由于 Python 是一门语言,让我在多年的 Java 编程之后尝到了函数式编程的鲜血。我忍不住要编写更多功能风格的代码(例如,列表理解优于 for 循环)。此外,列表理解让我更容易在以后重构我的代码,以防需要结果并需要添加过滤器。所以我通常更喜欢列表理解而不是 for 循环。
    • 我发现我的情况正好相反:我更经常需要 add 到循环结构中,以进行调试或附加功能,因此我选择了巧妙的 listcomp写得乏味。您还将每次构建列表的开销添加到代码中,从而影响速度和内存。我确实理解更实用的方法的吸引力,但这不是正确的方法。 (顺便说一句,你读过 David Beazley 的惊人的 Generator Tricks for Smart Programmers 吗?它充满了我认为你会发现非常有用的技术......)
    • 大崩溃!这是我喜欢找出的东西的类型! :D
    猜你喜欢
    • 2023-03-08
    • 2016-12-29
    • 2012-09-29
    • 2018-01-21
    • 2012-09-12
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    相关资源
    最近更新 更多