【问题标题】:Browse files and subfolders in Python在 Python 中浏览文件和子文件夹
【发布时间】:2011-08-14 14:29:34
【问题描述】:

我想浏览当前文件夹及其所有子文件夹并获取所有带有 .htm|.html 扩展名的文件。我发现可以像这样找出一个对象是目录还是文件:

import os

dirList = os.listdir("./") # current directory
for dir in dirList:
  if os.path.isdir(dir) == True:
    # I don't know how to get into this dir and do the same thing here
  else:
    # I got file and i can regexp if it is .htm|html

最后,我希望将所有文件及其路径放在一个数组中。有这样的可能吗?

【问题讨论】:

标签: python subdirectory


【解决方案1】:

您可以使用os.walk() 递归地遍历一个目录及其所有子目录:

for root, dirs, files in os.walk(path):
    for name in files:
        if name.endswith((".html", ".htm")):
            # whatever

要构建这些名称的列表,您可以使用列表推导:

htmlfiles = [os.path.join(root, name)
             for root, dirs, files in os.walk(path)
             for name in files
             if name.endswith((".html", ".htm"))]

【讨论】:

  • 我认为一些值得一提的细微差别是它将遍历/包含隐藏文件,并且这也不会为您解析链接。也不能保证枚举的每个文件/目录都会存在(主要是因为链接可以存在,但其目标可能不存在)。 Some further reading 关于解析链接可能对某些人有所帮助,具体取决于您打算如何使用 os.walk
【解决方案2】:

我有类似的事情要做,我就是这样做的。

import os

rootdir = os.getcwd()

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        #print os.path.join(subdir, file)
        filepath = subdir + os.sep + file

        if filepath.endswith(".html"):
            print (filepath)

希望这会有所帮助。

【讨论】:

  • @Pryaditya_Das,太棒了!
【解决方案3】:

在 python 3 中你可以使用 os.scandir():

for i in os.scandir(path):
    if i.is_file():
        print('File: ' + i.path)
    elif i.is_dir():
        print('Folder: ' + i.path)

【讨论】:

    【解决方案4】:

    使用newDirName = os.path.abspath(dir) 为子目录创建一个完整的目录路径名,然后像对父目录一样列出其内容(即newDirList = os.listDir(newDirName)

    您可以为您的代码创建一个单独的方法 sn-p 并通过子目录结构递归调用它。第一个参数是目录路径名。这将针对每个子目录进行更改。

    此答案基于 Python 库的 3.1.1 版本文档。 Python 3.1.1 库参考(第 10 章 - 文件和目录访问)的第 228 页上有一个很好的模型示例。 祝你好运!

    【讨论】:

      【解决方案5】:

      Sven Marnach 解决方案的略微改动版本..

      
      import os
      
      

      folder_location = 'C:\SomeFolderName' file_list = create_file_list(folder_location)

      def create_file_list(path): return_list = []

      for filenames in os.walk(path): for file_list in filenames: for file_name in file_list: if file_name.endswith((".txt")): return_list.append(file_name) return return_list

      【讨论】:

      • 由于某种原因,上面的粘贴中有多余的空格,for块的缩进不正确.. SO的标记不喜欢我..
      • 简单代码的返工很差 - 用嵌入式循环替换元组赋值会降低代码的可读性,并且可能效率也会降低
      • 感谢@volcano 的评论。上面的例子似乎不起作用,因此额外的 for 循环..
      【解决方案6】:
      from tkinter import *
      import os
      
      root = Tk()
      file = filedialog.askdirectory()
      changed_dir = os.listdir(file)
      print(changed_dir)
      root.mainloop()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-29
        • 1970-01-01
        • 2013-04-14
        • 2012-12-22
        • 1970-01-01
        • 2017-09-16
        • 2020-11-05
        • 1970-01-01
        相关资源
        最近更新 更多