You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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()

问题分析

  1. 硬编码文件名:打开文件时直接写死了"animals.txt",没有使用传入的filename参数,导致无法处理任意输入文件。
  2. 遍历方式错误:text = f.read()会把文件内容读取为单个字符串,此时for line in text会逐个遍历字符,而非按行遍历。
  3. 缺少筛选逻辑:没有判断每行是否包含目标关键词,所以无法输出符合条件的行。

修复后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 17:10:25