读取目录中的所有文件时出现问题?

时间:2014-12-27 01:42:16

标签: python regex python-2.7 io directory

我有一个包含大量.txt文件的文件夹,我想阅读它们。为此,首先我使用一些正则表达式来捕获我将使用的importat内容。所以我正在做以下事情:

    txt_files =(path, '*.txt')
    important_stuff = re.findall("(\S+)\s+(NC\S+).*\n.*\s(\S+)\s+(AQ\S+)",txt_files)

    print important_stuff

问题在于我获得了TypeError:expected string or buffer如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

更健全的方法可能是:

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

那是因为(A)codecs.open打开一个文件进行阅读 - 它不会打开带有外卡的多个文件,也不会返回文件名; (B)re.findall适用于单个字符串,txt_files肯定不是一个字符串。

这假设您根据文件名选择important_stuff。如果您真正选择文件' 内容,您无论如何都需要打开并阅读每个文件,因此列表理解变得有点笨拙,人们可能会喜欢,例如

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

在这里,我建立了一个从文件名到文件内容的词典,以避免打开和阅读每个文件两次 - 一次检查它是否是重要的东西"重要的东西& #34;然后再来处理它,如果是的话。如果所有这些都不适合记忆,那么,双重读数可能更简单 - 然后我们将{b}发送到important_stuff = list()important_stuff.append(fn) if然后我们再次打开并阅读这些记录为"重要内容的文件名"。

如果需要保留re.search中匹配的那些群组(以避免再次扫描它们),可能会有更多内容,但这样做太难以进一步猜测! - )

答案 1 :(得分:0)

您无法在codecs.open中使用regex(或glob扩展名)。它需要一个文件名。这就是你收到错误的原因。

所以你不能这样做:

txt_files = [(codecs.open('/the/path/ofthedirectory/*.txt','r','utf8')).readlines()]

您应该使用os.listdiros.walkglob.iglobglob.glob迭代器变体)之类的内容,过滤结果,然后打开每个文件。

所以你得到这样的东西:

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