如何用Python实现简化版grep工具(仅依赖sys模块)
用Python实现简化版grep工具(仅依赖sys模块)
需求:实现一个简化版grep工具,执行命令python mygrep.py duck animals.txt时,输出文件中包含指定关键词的行(例如"The duck goes quack")。要求仅导入sys模块,禁止使用re模块。现有初始代码无法筛选符合条件的行,需要修复。
初始代码:
import sys def main(): if len(sys.argv) != 3: exit('Please pass 2 arguments.') search_text = sys.argv[1] filename = sys.argv[2] with open("animals.txt", 'r') as f: text = f.read() for line in text: print(line) if __name__ == '__main__': main()
问题分析
- 硬编码文件名:打开文件时直接写死了
"animals.txt",没有使用传入的filename参数,导致无法处理任意输入文件。 - 遍历方式错误:
text = f.read()会把文件内容读取为单个字符串,此时for line in text会逐个遍历字符,而非按行遍历。 - 缺少筛选逻辑:没有判断每行是否包含目标关键词,所以无法输出符合条件的行。
修复后的代码
import sys def main(): if len(sys.argv) != 3: exit('Please pass 2 arguments.') search_text = sys.argv[1] filename = sys.argv[2] with open(filename, 'r') as f: # 直接遍历文件对象,按行读取 for line in f: # 去除行尾换行符(可选,避免重复换行) stripped_line = line.rstrip('\n') if search_text in stripped_line: print(stripped_line) if __name__ == '__main__': main()
修改说明
- 替换硬编码文件名:将
open("animals.txt", 'r')改为open(filename, 'r'),适配命令行传入的任意文件。 - 正确按行遍历:直接遍历文件对象
f,Python会自动按行读取,无需先读取整个文件内容。 - 添加筛选逻辑:用
if search_text in stripped_line判断当前行是否包含关键词,符合条件才输出。使用rstrip('\n')去除行尾的换行符,避免输出时出现多余空行。
内容的提问来源于stack exchange,提问作者Plqcid
相关产品推荐
相关产品推荐

