擅长:python、mysql、java
<p>更合理的方法可能是:</p>
<pre><code>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)]
</code></pre>
<p>这是因为(A)<code>codecs.open</code>打开一个文件进行读取,它不会打开多个带有通配符的文件,也不会返回文件名;(B)<code>re.findall</code>在单个字符串上工作,<code>txt_files</code>肯定不是一个字符串。你知道吗</p>
<p>这假设您是基于<strong>文件名选择<code>important_stuff</code>。如果您实际上是在选择文件的<strong>内容,那么无论如何您都需要打开并阅读每个文件,因此列表理解会变得有点笨拙,您可能更喜欢例如</p>
<pre><code>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
</code></pre>
<p>在这里,我构建了一个从文件名到文件内容的dict,以避免打开和读取每个文件两次来检查它是否是“重要的东西”,然后再检查它是否是。如果所有这些都不在内存中,那么双读可能会更简单,然后我们会去bavk到<code>important_stuff = list()</code>和<code>important_stuff.append(fn)</code>中的<code>if</code>,然后我们会再次打开并读取记录为“重要内容”的文件名。你知道吗</p>
<p>如果那些在<code>re.search</code>中匹配的组需要被保存(以避免再次扫描),那么可能会有更多的组,但是这对于您来说太难猜测w/o了!-)你知道吗</p>