import glob, re
txt_files = glob.glob('/the/path/ofthedirectory/*.txt')
important_stuff = [fn for fn in txt_files
if re.search(r"(\S+)\s+(NC\S+).*\n.*\s(\S+)\s+(AQ\S+)", fn)]
important_stuff = dict()
for fn in txt_files:
with codecs.open(fn, 'utf-8') as f:
contents = f.read()
if re.search(r"(\S+)\s+(NC\S+).*\n.*\s(\S+)\s+(AQ\S+)", contents):
important_stuff[fn] = contents
# filter to have only txts
txt_files = [p for p in os.listdir('/path/to/dir') if p.endswith('.txt')]
# do your filtering
important_stuff = re.findall("(\S+)\s+(NC\S+).*\n.*\s(\S+)\s+(AQ\S+)", txt_files)
更合理的方法可能是:
这是因为(A)
codecs.open
打开一个文件进行读取,它不会打开多个带有通配符的文件,也不会返回文件名;(B)re.findall
在单个字符串上工作,txt_files
肯定不是一个字符串。你知道吗这假设您是基于文件名选择
important_stuff
。如果您实际上是在选择文件的内容,那么无论如何您都需要打开并阅读每个文件,因此列表理解会变得有点笨拙,您可能更喜欢例如在这里,我构建了一个从文件名到文件内容的dict,以避免打开和读取每个文件两次来检查它是否是“重要的东西”,然后再检查它是否是。如果所有这些都不在内存中,那么双读可能会更简单,然后我们会去bavk到
important_stuff = list()
和important_stuff.append(fn)
中的if
,然后我们会再次打开并读取记录为“重要内容”的文件名。你知道吗如果那些在
re.search
中匹配的组需要被保存(以避免再次扫描),那么可能会有更多的组,但是这对于您来说太难猜测w/o了!-)你知道吗不能在codecs.open中使用
regex
(或glob
扩展)。它需要一个文件名。所以你才会出错。你知道吗所以你不能这么做:
应该使用os.listdir或os.walk或glob.iglob(glob.glob迭代器变量)之类的方法,过滤结果,然后打开每个文件。你知道吗
所以你会得到这样的结果:
相关问题 更多 >
编程相关推荐