在python中使用grep

在python中使用grep,python,grep,Python,Grep,有一个文件(query.txt),其中包含一些关键字/短语,可以使用grep与其他文件进行匹配。下面代码的最后三行工作正常,但是当在while循环中使用相同的命令时,它会进入无限循环或其他什么(即不响应) 首先,您没有正确地迭代文件。您只需在f:中对b使用,而不必使用.readline()之类的东西 然后,当文件名包含shell中具有特殊含义的字符时,您的代码就会吹到您的脸上。使用而不是os.system()并传递参数列表 这里有一个固定版本: import os import subproce

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


首先,您没有正确地迭代文件。您只需在f:中对b使用
,而不必使用
.readline()
之类的东西

然后,当文件名包含shell中具有特殊含义的字符时,您的代码就会吹到您的脸上。使用而不是
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'])

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

您的代码扫描整个
my2.txt
文件,用于
query.txt
中的每个查询

您想:

  • 将所有查询读取到列表中
  • 在文本文件的所有行上迭代一次,并根据所有查询检查每个文件
  • 请尝试以下代码:

    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
    

    这实际上不是使用Python的好方法,但如果必须执行类似操作,请正确执行:

    from __future__ import with_statement
    import subprocess
    
    def grep_lines(filename, query_filename):
        with open(query_filename, "rb") as myfile:
            for line in myfile:
                 subprocess.call(["/bin/grep", line.strip(), filename])
    
    grep_lines("my2.txt", "query.txt")
    
    希望您的文件不包含任何在正则表达式中具有特殊含义的字符=)

    此外,您也可以单独使用
    grep
    来执行此操作:

    grep -f query.txt my2.txt
    
    它的工作原理如下:

    ~ $ cat my2.txt 
    One two
    two two
    two three
    ~ $ cat query.txt 
    two two
    three
    ~ $ python bar.py 
    two two
    two three
    
    这将把query.txt中的所有关键字与my2.txt文件匹配,并将输出保存在out.txt中


    阅读
    man grep
    了解所有可能参数的描述。

    在Python中有
    re
    模块时,为什么要使用
    grep
    ?这是一个赋值。我们被告知您使用grep:(如果您的搜索模式中有空格,那么您需要在构建的命令行中使用引号,就像在测试的最后3行一样。您希望命令的内容是:
    grep“他是”my2.txt
    ,但正如这里所示,命令行是:
    grep他是my2.txt
    readline()
    将行终止符
    \n
    保留在返回的字符串中,这可能会使
    grep
    更加混乱。您好,感谢您的回复。我需要使用grep,因为这是一项作业。使用您的代码后,我收到以下错误grep:is:没有这样的文件或directory@user1171232:见我对欧盟的评论miro的回答。嗨,谢谢你的回答。我被要求在python中使用grep,因为这是一个赋值,我们被告知要这样做。在使用你的代码后,我得到以下错误grep:is:没有这样的文件或directory@user1171232:您的
    query.txt
    中有什么内容?是否执行
    子流程调用([“/bin/grep”,“-e”,line.strip(),文件名])
    work better?Query.txt有用换行符分隔的关键字/短语。没有。更改没有任何好处,并且显示了相同的错误。@user1171232:我在这里添加了一个示例,演示了代码的工作原理。如果您不告诉我Query.txt中的内容,我不确定我是否可以进一步帮助您。我在上面的注释中写下了Query.txt的内容。我t有以换行符分隔的关键字。这些关键字将在my2.txt中匹配。谢谢
    ~ $ cat my2.txt 
    One two
    two two
    two three
    ~ $ cat query.txt 
    two two
    three
    ~ $ python bar.py 
    two two
    two three
    
    $ grep -wFf query.txt my2.txt > out.txt