我有一个包含大量.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
如何解决这个问题?
答案 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.listdir或os.walk或glob.iglob(glob.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)