【问题标题】:Using grep in python在 python 中使用 grep
【发布时间】:2012-01-26 12:29:41
【问题描述】:

有一个文件 (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)

【问题讨论】:

  • 既然 Python 中有 re 模块,为什么还要使用 grep
  • 这是一个作业。我们被告知你使用 grep :(
  • 如果您的搜索模式中有空格,您需要在构建的命令行中使用引号,就像在测试的最后 3 行中一样。您希望命令读取:grep "He is" my2.txt 但就目前而言,命令行是:grep He is my2.txt

标签: python grep


【解决方案1】:

首先,您没有正确地迭代文件。您可以简单地使用 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'])

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

【讨论】:

  • 您好,感谢您的回复。我需要使用 grep 因为这是一项任务。在使用您的代码后,我收到以下错误 grep: is: No such file or directory
  • @user1171232:请参阅我对 eumiro 回答的评论。
【解决方案2】:

您的代码会针对query.txt 中的每个查询扫描整个my2.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

【讨论】:

  • 另外,readline() 在返回的字符串中保留行终止符\n,这可能会另外混淆grep
【解决方案3】:

这实际上不是使用 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

【讨论】:

  • 您好,感谢您的回复。我需要在 python 中使用 grep,因为这是一项任务,我们被告知要这样做。使用您的代码后,我收到以下错误 grep: is: No such file or directory
  • @user1171232:您的query.txt 中有什么内容? subprocess.call(["/bin/grep", "-e", line.strip(), filename]) 效果更好吗?
  • Query.txt 包含由换行符分隔的关键字/短语。并且没有更改没有好处,并且显示相同的错误。
  • @user1171232:我添加了一个示例,显示代码在这里工作。如果您不告诉我您的 query.txt 中的内容,我不确定我能否进一步帮助您。
  • 我在上面的评论中写了 query.txt 有什么。它具有由换行符分隔的关键字。这些是要在 my2.txt 中匹配的关键字。谢谢
【解决方案4】:
$ grep -wFf query.txt my2.txt > out.txt

这会将 query.txt 中的所有关键字与 my2.txt 文件匹配,并将输出保存在 out.txt 中

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多