【问题标题】:Python function that similar to bash find command类似于 bash find 命令的 Python 函数
【发布时间】:2012-01-05 00:55:09
【问题描述】:

我的目录结构如下:

[me@mypc]$ tree .
.
├── set01
│   ├── 01
│   │   ├── p1-001a.png
│   │   ├── p1-001b.png
│   │   ├── p1-001c.png
│   │   ├── p1-001d.png
│   │   └── p1-001e.png
│   ├── 02
│   │   ├── p2-001a.png
│   │   ├── p2-001b.png
│   │   ├── p2-001c.png
│   │   ├── p2-001d.png
│   │   └── p2-001e.png

我想写一个python脚本把所有的*a.png重命名为01.png,*b.png重命名为02.png,等等。首先我想我必须使用类似于find . -name '*.png' 的东西,而我在python 中发现的最相似的东西是os.walk。但是,在os.walk 中,我必须检查每个文件,如果它是 png,那么我会将它与它的根连接起来,不知何故不那么优雅。我想知道是否有更好的方法来做到这一点?提前致谢。

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以使用os.walk 来遍历目录树。 也许这行得通?

    import os
    
    for dpath, dnames, fnames in os.walk("."):
      for i, fname in enumerate([os.path.join(dpath, fname) for fname in fnames]):
        if fname.endswith(".png"):
          #os.rename(fname, os.path.join(dpath, "%04d.png" % i))
          print "mv %s %s" % (fname, os.path.join(dpath, "%04d.png" % i))
    

    对于 Python 3.4+,您可能希望将 pathlib.glob() 与递归模式(例如,**/*.png)一起使用:

    【讨论】:

    • 我会考虑使用if file.endswith(".png"): 而不是rsplit()(这会比实际需要做更多的工作)。
    【解决方案2】:

    如今,pathlib 是一个方便的选择。

    【讨论】:

      【解决方案3】:

      查看来自 David M. Beazley 的 genfind.py。

      # genfind.py
      #
      # A function that generates files that match a given filename pattern
      
      import os
      import fnmatch
      
      def gen_find(filepat,top):
          for path, dirlist, filelist in os.walk(top):
              for name in fnmatch.filter(filelist,filepat):
                  yield os.path.join(path,name)
      
      # Example use
      
      if __name__ == '__main__':
          lognames = gen_find("access-log*","www")
          for name in lognames:
              print name
      

      【讨论】:

        【解决方案4】:

        对于这样的搜索模式,您可能可以使用glob。

        from glob import glob
        paths = glob('set01/*/*.png')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-14
          • 2013-12-07
          • 1970-01-01
          • 2020-05-04
          • 1970-01-01
          • 1970-01-01
          • 2012-01-06
          • 2015-06-26
          相关资源
          最近更新 更多