在python中使用grep

use*_*232 5 python grep

有一个文件(query.txt),它有一些关键字/短语,可以使用grep与其他文件匹配.以下代码的最后三行完美地工作,但是当在while循环中使用相同的命令时,它会进入无限循环或其他东西(即不响应).

import os

f=open('query.txt','r')
b=f.readline()
while b:
    cmd='grep %s my2.txt'%b    #my2 is the file in which we are looking for b
    os.system(cmd)
    b=f.readline()
f.close()

a='He is'
cmd='grep %s my2.txt'%a
os.system(cmd)
Run Code Online (Sandbox Code Playgroud)

Thi*_*ter 6

首先,您没有正确地迭代文件.你可以简单地使用for b in f:没有.readline()东西.

一旦文件名包含任何在shell中具有特殊含义的字符,您的代码就会在您的脸上吹响.使用subprocess.call而不是os.system()传递参数列表.

这是一个固定版本:

import os
import subprocess
with open('query.txt', 'r') as f:
    for line in f:
        line = line.rstrip() # remove trailing whitespace such as '\n'
        subprocess.call(['/bin/grep', line, 'my2.txt'])
Run Code Online (Sandbox Code Playgroud)

但是,您可以通过不调用来进一步改进代码grep.读取my2.txt字符串,然后使用该re模块执行搜索.如果你根本不需要正则表达式,你甚至可以简单地使用if line in my2_content


eum*_*iro 5

您的代码会扫描整个my2.txt文件以查找query.txt.

你想要:

  1. 将所有查询读入列表
  2. 遍历文本文件的所有行并根据所有查询检查每个文件。

试试这个代码:

with open('query.txt','r') as f:
    queries = [l.strip() for l in f]

with open('my2.txt','r') as f:
    for line in f:
        for query in queries:
            if query in line:
                print query, line
Run Code Online (Sandbox Code Playgroud)

  • 此外,“readline()”在返回的字符串中保留行终止符“\n”,这可能会另外混淆“grep”。 (2认同)