我有一个很大的文件目录,范围从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])
答案 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)