使用"模糊匹配"读取或打开文件filename - Python

时间:2017-04-03 05:50:09

标签: python regex file io

给出目录中的文件列表:

import os
os.listdir('system-outputs/newstest2016/ru-en')

[OUT]:

['newstest2016.AFRL-MITLL-contrast.4524.ru-en',
 'newstest2016.AFRL-MITLL-Phrase.4383.ru-en',
 'newstest2016.AMU-UEDIN.4458.ru-en',
 'newstest2016.NRC.4456.ru-en',
 'newstest2016.online-A.0.ru-en',
 'newstest2016.online-B.0.ru-en',
 'newstest2016.online-F.0.ru-en',
 'newstest2016.online-G.0.ru-en',
 'newstest2016.PROMT-Rule-based.4277.ru-en',
 'newstest2016.uedin-nmt.4309.ru-en']

然后我有输入:

filename, suffix = 'newstest2016.AFRL-MITLL-contrast', 'ru-en'

使用文件名,如果我想进行正则表达式匹配,以便我可以读取文件newstest2016.AFRL-MITLL-contrast.4524.ru-en,我可以这样做:

import re
fin = open(next(_fn for _fn in os.list('system-outputs/newstest2016/ru-en') if re.match(filename + '.*.' + suffix, _fn) for _fn in))

但是有没有办法阅读/打开模糊匹配"文件名?必须有比上面原始re.match方式更好的方法。

可以假设os.listdir总是应该有一个明确的匹配。

2 个答案:

答案 0 :(得分:5)

我相信glob可能是更好的方式。

答案 1 :(得分:0)

您可以按照建议使用glob,但它可以提供多个匹配项。我选择的模式似乎是:

filenames = [
    'newstest2016.AFRL-MITLL-contrast.4524.ru-en',
    # ...
    'newstest2016.PROMT-Rule-based.4277.ru-en',
    'newstest2016.uedin-nmt.4309.ru-en'
]
my_filename, suffix = 'newstest2016.AFRL-MITLL-contrast', 'ru-en'
for filename in filenames:
    *fn, suff = filename.split('.')
    if ('.'.join(fn[:-1]), suff) == (my_filename, suffix):
        break
else:
    filename = None
# `filename` is now set to real file name

我使用python3.x获得更好的语法,但这很容易移植到python2.x。