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

2024-10-02 08:29:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件夹有很多.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

问题是我想知道怎么解决这个问题?。你知道吗


Tags: 文件pathretxt文件夹内容filesprint
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

在这里,我构建了一个从文件名到文件内容的dict,以避免打开和读取每个文件两次来检查它是否是“重要的东西”,然后再检查它是否是。如果所有这些都不在内存中,那么双读可能会更简单,然后我们会去bavk到important_stuff = list()important_stuff.append(fn)中的if,然后我们会再次打开并读取记录为“重要内容”的文件名。你知道吗

如果那些在re.search中匹配的组需要被保存(以避免再次扫描),那么可能会有更多的组,但是这对于您来说太难猜测w/o了!-)你知道吗

不能在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)

相关问题 更多 >

    热门问题