【问题标题】:How to know which file to open (and open it) in Python based on its name matching a pattern?如何根据与模式匹配的名称知道在 Python 中打开(并打开)哪个文件?
【发布时间】:2015-09-21 20:37:24
【问题描述】:

我有一个文件,它的名称每天都会更新,但名称总是匹配一些简单的模式,例如它总是以“报告”开头,例如报告 1 A 2X.csv

我如何在任何一天打开文件,不知道它的名称是什么,但知道模式并且知道文件夹中只有一个文件匹配?

如果我定义:

pattern = 'report'

那么我如何将os.listdir('.')str.startswith(pattern)open() 结合起来来实现这一点?

【问题讨论】:

标签: python string python-2.7 match


【解决方案1】:

试试这个:

from glob import glob
file = open(glob('report *')[0])

【讨论】:

    【解决方案2】:

    您可以查看glob 模块。它接受一个模式并返回与该模式匹配的所有文件的列表。

    例子-

    >>> import glob
    >>> glob.glob('*.py')
    ['a.py', 'b.py', 'getpip.py']
    

    然后您可以遍历此 glob.glob 的结果并打开每个文件并执行您的逻辑 -

    例子-

    for f in glob.glob('report*'):
        <your logic>
    

    请注意,glob 使用shell-style 通配符作为模式(不是正则表达式)。

    【讨论】:

      【解决方案3】:

      你可以用这样的正则表达式找到一些东西:

      import re
      x = re.findall(r'report.*csv', 'any text here report 1 A 2X.csv some more stuff here' )
      

      输出:

      ['report 1 A 2X.csv']
      

      【讨论】:

        【解决方案4】:

        正如其他人所指出的,reglobfnmatch() 是很棒的模式匹配工具。由于您的模式足够简单,startswithendswith 将满足您的需求。

        我有一个目录,其中包含一些 csv 文件,特别是一个名为 report_1_A_2x.csv 的目录。我们可以列出所有以report开头并以.csv结尾的csv文件。在这种情况下,只有一个匹配,所以我们打开它然后做一些事情:

        import os
        
        path = '.' # path to file
        pattern = 'report'
        suffix = '.csv'
        
        files = [f for f in os.listdir(path) if f.startswith(pattern) and f.endswith(suffix)]
        print files # prints: ['report_1_A_2x.csv']
        
        with open(os.path.join(path, files[0]), 'r') as rep:
            # do something ...
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多