【问题标题】: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】:
正如其他人所指出的,re、glob 和 fnmatch() 是很棒的模式匹配工具。由于您的模式足够简单,startswith 和 endswith 将满足您的需求。
我有一个目录,其中包含一些 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 ...