Python 如何获取文件名中具有特定年份的文件?
我有一个从2009年到2017年的大文件目录。我只想获取名称中包含特定年份的文件,并将它们连接在一起:例如,名称中包含2009、2012或2016的所有文件。我找到了一些我一直在玩的起始代码,但我敢肯定这是一个大混乱,因为它不工作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) 我也在想
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”开头,那么跳过。太好了!那就行了。非常感谢!