Python - проверять слова не в файлах в папке - PullRequest
0 голосов
/ 04 октября 2011

Я формулирую скрипт для проверки, находится ли определенное слово в пути или нет.

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить конкретный результат без результатов отдельных файлов.

Example:
path = "/opt/webserver/logs/"

file1.txt
file2.txt
file3.txt
....
...
..
file10000.txt

Код ниже:

#checkWordinFiles.py
import os

words = [ "Apple", "Oranges", "Starfruit" ]
path = "/opt/webserver/logs"
files = os.listdir(path)
for infile in files:
        for word in words:
                if word not in infile:
                        print word

Проблема в том, что слово не в каждом файле.Этот скрипт распечатает слова, которых нет в файлах, но я хочу напечатать слово, только если его нет ни в одном из них.

Я хочу, чтобы скрипт распечатал слова, которых нетв любом из файлов в пути.

Вроде как "grep Apple *" каждый раз.

Есть идеи?

Ответы [ 4 ]

1 голос
/ 04 октября 2011

Концептуальная проблема заключается в том, что os.listdir создает список имен файлов в каталоге; поэтому вы ищете слова в файле имя , а не в файле содержание . Чтобы это исправить, вам нужно будет использовать имя файла, чтобы открыть и прочитать файл.

Способ показа:

import os

def contents(filename):
    with file(filename) as f: return f.read()

words = set(["Apple", "Oranges", "Starfruit"])
path = "/opt/webserver/logs"
filenames = os.listdir(path)
print words.difference(
    reduce(lambda x, y: x.union(y), (
        # Note that the following assumes we really want to treat the file
        # as a sequence of words, and not do general substring searching.
        # For example, it will miss "apple" if the file contains "pineapples".
        set(contents(filename).split()).intersection(words)
        for filename in filenames
        # In fact, the .intersection call there is redundant, but might improve
        # performance and will probably save memory at least.
    ))
)
0 голосов
/ 04 октября 2011

Предположим, вы хотите найти слово "foo" в /path/to/file.

Do,

for line in open("/path/to/file"):
    if "foo" in line:
         print "hurray. you found it"

Изменить его, чтобы работать для вас.Вы можете получить имя файла с помощью os.listdir () и продолжить соответственно.

0 голосов
/ 04 октября 2011
#checkWordinFiles.py
import os

words = [ "Apple", "Oranges", "Starfruit" ]
path = "/opt/webserver/logs"
files = os.listdir(path)

for word in words:
    for infile in files:
        if word in infile:
            break;
    else:
        print 'word - %s not found in any of the files' % (word,)

РЕДАКТИРОВАТЬ: Я не обращал внимания на логин чтения файла.Как упоминал @Karl, вы должны прочитать все файлы в пути и затем искать слова в файле.Вы можете использовать os.walk(), чтобы получить список всех файлов в пути, включая файлы в подкаталогах.

0 голосов
/ 04 октября 2011

Вот как вы можете это сделать:

for word in words:
    word_found = False
    for infile in files:
        if word in infile:
            word_found = True
            break
    if not word_found:
        print "%s not in any file" % word
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...