【问题标题】:Iterating over a text files in a subdirectory迭代子目录中的文本文件
【发布时间】:2018-09-01 02:13:56
【问题描述】:

如何仅在目录中迭代文本文件?到目前为止我所拥有的是;

for file in glob.glob('*'):
    f = open(file)
    text = f.read()
    f.close()

这可行,但是我必须将我的 .py 文件存储在同一目录(文件夹)中以使其运行,因此迭代包括 .py 文件本身。理想情况下,我想要指挥的是;

  1. “查看此子目录/文件夹,并遍历其中的所有文件”

或者...

  1. “查看此目录中的所有文件并遍历扩展名为 .txt 的文件”

我确定我要求的是一些相当直截了当的东西,但我不知道如何继续。可能值得我强调的是,我通过反复试验获得了 glob 模块,所以如果这是绕过这个特定方法的错误方法,请随时纠正我!谢谢。

【问题讨论】:

标签: python loops


【解决方案1】:

glob.glob() 使用与标准类 unix shell 相同的通配符模式匹配。当然,该模式可用于过滤扩展:

# this will list all ".py" files in the current directory
# (
>>> glob.glob("*.py")
['__init__.py', 'manage.py', 'fabfile.py', 'fixmig.py']

但它也可以用于探索给定的相对路径:

>>> glob.glob("../*")
['../etc', '../docs', '../setup.sh', '../tools', '../project', '../bin', '../pylint.html', '../sql']

或绝对:

>>> glob.glob("/home/bruno/Bureau/mailgun/*")
['/home/bruno/Bureau/mailgun/Domains_ Verify - Mailgun.html', '/home/bruno/Bureau/mailgun/Domains_ Verify - Mailgun_files']

当然你也可以同时做这两件事:

>>> glob.glob("/home/bruno/Bureau/*.pdf")
['/home/bruno/Bureau/marvin.pdf', '/home/bruno/Bureau/24-pages.pdf', '/home/bruno/Bureau/alice-in-wonderland.pdf']

【讨论】:

    【解决方案2】:

    glob.glob 函数实际上将一个通配模式作为其参数。 例如,"*.txt" while 匹配名称以.txt 结尾的文件。

    这里是你如何使用它:

    for file in glob.glob("*.txt"):
        f = open(file)
        text = f.read()
        f.close()
    

    但是,如果您想排除某些特定文件,例如 .py 文件,则通配符的语法不直接支持这一点,如 here 所述。

    在这种情况下,您需要获取这些文件,然后手动排除它们:

    pythonFiles = glob.glob("*.py")
    otherFiles = [f for f in glob.glob("*") if f not in pythonFiles]
    

    【讨论】:

      【解决方案3】:

      解决方法很简单。

      for file in glob.glob('*'):
          if not file.endswith('.txt'):
              continue
          f = open(file)
          text = f.read()
          f.close()
      

      【讨论】:

      • 你是对的,这非常简单!感谢您抽出宝贵时间回复。
      • @DC_Liv 不用担心。作为解决此类问题的一般技巧,在 Python3 中,您可以使用制表符完成来查找变量提供的所有成员函数。为x 分配一个代表文件名,然后在解释器提示中仅使用x 按tab。这应该列出str 的所有方法,其中之一是endswith。标准库中的大多数函数都命名得很好。如果您不确定help(x.endswith) 的作用是什么,通常会提供解释。
      • 这也是一个完整的 WTF - glob 的全部意义在于避免这种测试并直接获取与 glob 表达式匹配的名称(文件或文件夹)。
      猜你喜欢
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 2018-11-15
      • 1970-01-01
      相关资源
      最近更新 更多