因此,在“使用Python自动化无聊的东西”一书中,有这个家庭作业项目:
编写一个程序,打开文件夹中的所有.txt
个文件,并搜索与用户提供的正则表达式匹配的任何行。结果应打印在屏幕上。
以下是我的代码。我有两个问题:
import os, re
# Dir Location
print('Enter a directory location: (in which txt files are located)')
direct= input()
os.chdir(direct)
# Regexes
print("Enter the text you'd like to search for: (or a regex)")
givenReg= input()
soloReg= re.compile(givenReg)
lineReg= re.compile((r'^\n.*')+givenReg+(r'.*\n$'))
txtFileReg= re.compile(r'.*\.txt')
# Texts in Dir
txtFiles= os.listdir(direct)
# Finding line through Regex
for i in range(len(txtFiles)):
if txtFileReg.search(txtFiles[i]) != None:
file= open(txtFiles[i])
read= file.read()
outcomeSolo= soloReg.findall(read)
outcomeLine= lineReg.findall(read)
print('In ' + txtFiles[i] + ', found these matches:')
print(outcomeLine)
print('In ' + txtFiles[i] + ', the lines for these matches were:')
print(outcomeSolo)
print('\n')
file.close()
答案 0 :(得分:1)
使程序缩短的一种方法是使其行为更像典型的命令行程序:将输入作为参数,而不是通过某种类型的对话。
另一种方法是使输出不那么健谈。看看grep
如何适用于一个例子。
您还可以利用glob()
等内容。
不是将整个文件读入内存,而是逐行遍历文件(这在这样的程序中有许多优点)。
最后,我不清楚为什么要将用户的正则表达式包装在自己的前导和尾随模式中:让用户完全控制正则表达式(至少,这就是我要做的)。
以下是这些要点的简短说明:
import sys, glob, re
dir_path = sys.argv[1]
rgx = re.compile(sys.argv[2])
for path in glob.glob(dir_path + '/*.txt'):
with open(path) as fh:
for line in fh:
if rgx.search(line):
msg = '{}:{}'.format(path, line)
print(msg, end = '')