编写一个程序,打开文件夹中所有的.txt 文件,查找匹配用户提供的正则表达式的所有行。结果应该打印到屏幕上。
还是太年轻了
刚开始看到这个要求,觉得很简单,open()打开文本文件,编辑regex并且匹配文件对应行,并打印在屏幕上
没那么容易
开始写代码:
首先import os,re,感觉还会用到sys。先加上再说。
路径问题就来了:
脑海中默认的文件夹是有子文件夹和文件的。在判断给出路径是文件夹且不为空的时候,后面就卡壳了
import os,re,sys
path=input('please enter a path:')
regex=re.compile(r'.*Mary.*',re.I) #匹配各种形式的mary
if os.path.isdir(path) and os.listdir(path) # 判断文件夹不为空
for file in os.listdir(path):
if os.path.splitext(file)[1]=='.txt':
fp=open(os.path.join(path,file),'r')
fpline=fp.readlines()
for line in fpline:
if regex.search(line):
print(line)
fp.close()
这样运行下来发现只有给出路径下的文本文件处理并输出了,然鹅,给出路径下的子文件中的文件没有处理。
求助于万能的度娘,发现原来是for语句中os.listdir(path)用的有问题。 这个只用于:在一个目录下面只有文件,没有文件夹。
文件夹中的子文件没有处理,就很正常了
那么给出路径中有子文件和文件的这种情况,需要用os.walk(),开始改代码。
import os,re,sys
path=input('please enter a path:')
regex=re.compile(r'.*Mary.*',re.I) #匹配各种形式的mary
if os.path.isdir(path) and os.listdir(path) # 判断文件夹不为空
for root,dirs,files in os.walk(path):
for file in files:
if os.path.splitext(file)[1]=='.txt':
fp=open(os.path.join(root,file),'r')
fpline=fp.readlines()
for line in fpline:
if regex.search(line):
print(line)
fp.close()
重新运行下,成功了,文件夹和文件都处理了。
因为前面给的路径,只要导出来的文件都是.txt文件。
然后就想把路径包含的范围扩大,比如,直接根目录下,或者是有很多类型的文件和文件夹,结果试运行就出错了,错误提示如图:
不太清楚是什么原因,先mark下吧,后面再继续研究。