【问题标题】:Iterate through folders, then subfolders and print filenames with path to text file遍历文件夹,然后是子文件夹并打印带有文本文件路径的文件名
【发布时间】:2013-11-24 18:37:51
【问题描述】:

我正在尝试使用 python 创建批量运行其他软件所需的文件。 作为其中的一部分,我需要生成一个文本文件,将所需的数据文件加载到软件中。 我的问题是我需要输入此文本文件的文件存储在一组结构化文件夹中。

我需要遍历一组文件夹(最多 20 个),每个文件夹最多可以包含 3 个文件夹,其中包含我需要的文件。文件夹的底层包含软件每次运行所需的一组文件。文本文件应逐行打印这些文件的路径+名称,添加指令行,然后从文件夹移动到下一组文件,依此类推,直到检查完所有子级文件夹。

【问题讨论】:

    标签: directory python-2.6 subdirectory


    【解决方案1】:

    使用 os.walk()。以下将输出“dir”子目录中所有文件的列表。可以根据您的需要对结果进行处理:

    import os                                                                                                             
                                                                                                                          
    def list_files(dir):                                                                                                  
        r = []                                                                                                            
        subdirs = [x[0] for x in os.walk(dir)]                                                                            
        for subdir in subdirs:                                                                                            
            files = os.walk(subdir).next()[2]                                                                             
            if (len(files) > 0):                                                                                          
                for file in files:                                                                                        
                    r.append(os.path.join(subdir, file))                                                                         
        return r                                                                                                          
    

    对于 python 3,将 next() 更改为 __next__()

    【讨论】:

      【解决方案2】:

      Charles 的回答很好,但可以改进以提高速度和效率。 os.walk() 产生的每个项目(参见docs)是三个项目的元组。这些项目是:

      1. 工作目录
      2. 命名工作目录中存在的任何子目录的字符串列表
      3. 工作目录中的文件列表

      知道了这一点,Charles 的大部分代码都可以通过修改 forloop 来压缩:

      import os
      
      def list_files(dir):
          r = []
          for root, dirs, files in os.walk(dir):
              for name in files:
                  r.append(os.path.join(root, name))
          return r
      

      【讨论】:

      • 那么根目录和目录的差异是什么?我应该为目录放什么?我要遍历的所有子文件夹的父文件夹对吗?这段代码对我不起作用:(返回空数组...
      • @alwaysaskingquestions rootos.walk() 生成的元组的第一项。 dir 是您要遍历的文件的目录。在我的答案代码中,子文件夹(由元组项dirs 表示)被忽略。仅使用文件及其根目录。
      • 只需使用列表理解:return [os.path.join(r, n) for r, _, f in os.walk(dir) for n in f]
      【解决方案3】:

      这将有助于列出特定的文件扩展名。在我的子文件夹中,我有很多文件,但我只对镶木地板文件感兴趣。

      import os
      dir = r'/home/output/'
      def list_files(dir):
      r = []
      for root, dirs, files in os.walk(dir):
          for name in files:
              filepath = root + os.sep + name
              if filepath.endswith(".snappy.parquet"):
                  r.append(os.path.join(root, name))
      return r
      

      【讨论】:

        猜你喜欢
        • 2016-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-28
        相关资源
        最近更新 更多