Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取文件名中具有特定年份的文件?_Python_Regex - Fatal编程技术网

Python 如何获取文件名中具有特定年份的文件?

Python 如何获取文件名中具有特定年份的文件?,python,regex,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) 我也在想

我有一个从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])

这条线是从哪里来的?在哪里重复使用路径?您的代码段中缺少bothi

您应该了解一下python glob在文件系统上使用模式匹配的情况:

也许是这样的:

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))

这也符合你的月份模式。

这条线是从哪里来的?在哪里重复使用路径?您的代码段中缺少bothi

您应该了解一下python glob在文件系统上使用模式匹配的情况:

也许是这样的:

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))

这也将符合你的月份模式。

你可以使用正则表达式来实现这一点,但这并不是绝对必要的,而且正则表达式在你的情况下可能会有些过分。相反,我会使用
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
中的每个字符串,查看哪些字符串包含指定的年份。使用
any
中的
find
完成此操作。
过滤器本质上会从列表中删除lambda不为true的任何值。

您可以使用正则表达式进行此操作,但这不是严格必需的,并且正则表达式在您的情况下可能会有些过分。相反,我会使用
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
中的每个字符串,查看哪些字符串包含指定的年份。使用
any
中的
find
完成此操作。
过滤器本质上会从列表中删除lambda不为true的任何值。

使用正则表达式可能有一种聪明的方法,但下面是一个简单的嵌套循环:

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)
或者使用嵌套列表理解(这比链接正则表达式更快、更清晰,也可能更快):

由于要显式处理文件,因此还可以使用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))))

使用正则表达式可能有一种聪明的方法,但这里有一个简单的嵌套循环:

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)
或者使用嵌套列表理解(这比链接正则表达式更快、更清晰,也可能更快):

由于要显式处理文件,因此还可以使用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))))

这非常有效,我发现我正在提取的文件存在问题。这些名称应该遵循以下约定:下划线后面的最后一个数字是01-12(例如file2016\u 01),但一些文件会删除零,因此看起来像这个file2016\u 4。如何修改上面的代码以排除这些代码?我在想一些逻辑,如果下划线后面的数字不是以“0”或“1”开头,那么跳过。太好了!那就行了。非常感谢!这非常有效,我发现我正在提取的文件存在问题。这些名称应该遵循以下约定:下划线后面的最后一个数字是01-12(例如file2016\u 01),但一些文件会删除零,因此看起来像这个file2016\u 4。如何修改上面的代码以排除这些代码?我在想一些逻辑,如果下划线后面的数字不是以“0”或“1”开头,那么跳过。太好了!那就行了。非常感谢!