如何获取文件名中包含特定年份的文件?

时间:2018-11-05 21:27:10

标签: python regex

我有一个很大的文件目录,范围从2009年到2017年。我只想获取名称中具有特定年份的文件并将它们串联在一起:例如,名称中具有2009、2012或2016的所有文件。我找到了一些我一直在使用的入门代码,但是我很确定这是一个大麻烦,因为它无法正常工作。

yearList = [2009, 2012, 2016]

path = 'my_file_path'
for i in yearList:
    s = re.search(i,line)
    if s:
       dfs.append(s)

我还认为遵循这些思路会更清洁

any (regex.match(line) for regex in [regex1, regex2, regex3])

4 个答案:

答案 0 :(得分:2)

线从哪里来?您在哪里重用路径?您的代码段中缺少bothi。

您应该查看在文件系统上使用模式匹配的python glob:https://docs.python.org/2/library/glob.html

也许是这样的:

import glob

yearList = [2009, 2012, 2016]
path = "my_file_path"
files = []
for year in yearList:
    files += glob.glob("{path}/*{year}*".format(path=path, year=year))
关于您的评论,

这个问题在使用python glob的单行代码中无法解决,因为它需要一些更高级的模式匹配,而glob不支持。将正则表达式与listdir结合使用可能会更好,但是使用glob,您可以在for循环中执行以下操作:

files += glob.glob("{path}/*{year}_0[1-9]*".format(path=path, year=year))
files += glob.glob("{path}/*{year}_1[0-2]*".format(path=path, year=year))

这也将与您的月份模式匹配。

答案 1 :(得分:0)

您可以为此使用正则表达式,但这不是绝对必要的,在您的情况下,正则表达式可能会过大。相反,我会使用find

from os import listdir
from os.path import isfile, join

years = [str(x) for x in [2009, 2012, 2016]]
myFiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
filesWithSpecificYears = filter(lambda x: any(x.find(y) >= 0 for y in years), myFiles)

我添加了代码,实际上是从给定目录中获取文件名,该文件名由mypath标识,因为在您的代码中没有看到该文件名。我的代码实际执行的操作是检查myFiles中的每个字符串,以查看其中包含指定年份的任何年份。使用find内部的any完成此操作。 filter本质上会从列表中删除所有lambda不正确的值。

答案 2 :(得分:0)

使用正则表达式可能有一个聪明的方法,但这是一个简单的嵌套循环,可以完成此工作:

import os
year_list = [2009, 2012, 2016]
file_list = os.listdir('some_path')
file_matches = []

for year in year_list:
    for fi in file_list:
        if str(year) in fi:
            file_matches.append(fi)

或具有嵌套列表理解功能(这比链接正则表达式更快,更简洁,也可能比链接正则表达式更快):

import os
year_list = [2009, 2012, 2016]
file_list = os.listdir('some_path')
file_matches = [fi for fi in files for yr in years if str(yr) in fi]

由于要显式处理文件,因此还可以使用glob:

from glob import glob
from os.path import join
year_list = [2009, 2012, 2016]
file_matches = []
for year in year_list:
    file_matches.extend(glob(join('some_path', '*{0}*'.format(year))))

答案 3 :(得分:0)

import os

yearList = [2009, 2012, 2016]
yearList = [str(y) for y in yearList]

root = 'path/to/directory/with/all/your/files'

with open('path/to/output', 'w') as outfile)
    for fname os.listdir(root):
        if not any(y in fname for y in yearList): continue
        with open(os.path.join(root, fname)) as infile:
            for line in infile:
                outfile.write(line)