Использование grep в python - PullRequest
5 голосов
/ 26 января 2012

Существует файл (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)

Ответы [ 4 ]

6 голосов
/ 26 января 2012

Прежде всего, вы не перебираете файл должным образом. Вы можете просто использовать for b in f: без .readline() материала.

Тогда ваш код появится в вашем лице, как только в имени файла будут какие-либо символы, имеющие особое значение в оболочке. Используйте 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

3 голосов
/ 26 января 2012

Ваш код сканирует весь файл 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
1 голос
/ 26 января 2012

На самом деле это не очень хороший способ использовать 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
0 голосов
/ 05 августа 2017
$ grep -wFf query.txt my2.txt > out.txt

это сопоставит все ключевые слова в query.txt с файлом my2.txt и сохранит выходные данные в out.txt

Прочитайте man grep для описания всех возможных аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...