【问题标题】:How do I tell a file from directory in Python?如何在 Python 中从目录中区分文件?
【发布时间】:2009-03-01 08:11:13
【问题描述】:

当使用 os.listdir 方法时,我需要知道结果列表中的哪个项目是目录还是只是一个文件。

当我必须遍历此列表中的所有目录,然后在每个目录中添加一个文件时,我遇到了一个问题。

有没有办法浏览这个列表并从中删除所有文件?如果无法使用 os.listdir,我应该改用什么方法?

谢谢。

【问题讨论】:

    标签: python file directory


    【解决方案1】:

    使用os.path.isdir 过滤掉目录。可能是这样的

    dirs = filter(os.path.isdir, os.listdir('/path'))
    for dir in dirs:
        # add your file
    

    【讨论】:

    • 感谢您的快速回答!我检查了 help(os.path) 并发现也许 isfile(path) 也会有用。 isdir(s) 如果路径名引用现有目录,则返回 true。 isfile(path) 测试路径是否为普通文件
    • 不要忘记测试文件是否为软链接:islink,ismount 测试文件是否为设备的挂载点。
    • 提醒listdir() 不会以绝对路径返回给定路径(示例中为'/path')的文件和目录,而只是返回文件名。而且我认为isdir()/isfile()etc 相对于当前工作目录进行检查,因此filter() 可能不起作用,除非您将listdir 的返回值转换为路径。
    【解决方案2】:

    这可能会更快:

    current, dirs, files = os.walk('/path').next()
    

    目录列表将在dirs 变量中。

    【讨论】:

      【解决方案3】:

      dirs = filter(os.path.isdir, os.listdir('/path'))

      请注意,除非 '/path' 是当前工作目录,否则这将不起作用。 os.listdir() 返回叶子名称,所以你会问“os.path.isdir('file.txt')”,如果当前目录在别处,你会看到错误的“file.txt”。

      os.path.join() 应该用于 os.listdir() 的输出以获得完整的文件名。

      children= [os.path.join('/path', child) for child in os.listdir('/path')]
      directories= filter(os.path.isdir, children)
      

      【讨论】:

      • 我就是这样做的。 dir = os.listdir(dir) i=len(dir)-1 while i>-1: if os.path.isfile(odir+'\\'+dir[i]): del dir[i] i = i- 1 其中 dir 是用户定义的目录。工作得很好。
      • 忘了说:odir = dir #'odir' 代表'original directory' 所以'odir' 包含用户定义的目录,'dir' 变成一个列表后。附言有什么方法可以编辑 cmets 吗? O_o
      • 你删除它们并重新发布,假装什么都没发生 :-)
      • 无论如何... 'odir+'\\'+dir[i]' 在 Windows 上可以正常工作,但 os.path.join() 是明确的跨平台方式。并不是说它可能对您只使用一次的脚本很重要......
      • 其实很重要,因为我自己也时不时用Linux,还有一些朋友,一开始只是没有想到正确的写法。我真的应该把它改成os.path.join,谢谢你的提及。
      【解决方案4】:

      评估您当前目录的子项:

      import os
      
      # Creates a list with all children items
      cd_children = os.listdir()
      
      # Iterate through the list
      for item in cd_children:
      
          # If item is a directory (folder) do...
          if os.path.isdir(item):
              print('{:<13}{:<21}'.format('folder', item))
      
          # If item is a file do ...
          elif os.path.isfile(item):
              print('{:<13}{:<21}'.format('file', item))
      

      示例输出

       folder          untitled folder      
       file            7972-orders.csv           
       file            8235-users.csv
       file            teads.py             
       file            table.csv
      

      使用osos.path

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-18
        • 2013-05-01
        • 2011-08-04
        • 2012-11-21
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多