LINUX.ORG.RU

Поиск в файле и вывод индекса

 , ,


2

1

Добрый день. Не могу одолеть простую проблемму((. В файле нужно найти 'Информация предоставлена\n' и получть индекс. Делаю так:

word = 'Информация предоставлена\n'
file = open('log.txt').readlines()

c = []
for line in file:
	if word in line:
		c.append(file.index(word))
print (c)

Вывод:

[164, 164, 164]

То есть, в файле действительно есть три раза 'Информация предоставлена\n' и это верно, но почему он мне только первый индекс добавляет в список? Когда нужно, что бы был список из индексов всех трех(или сколько найдет) этих элементов. Есть вариант, допустим если найдет в первый раз добавить в список, удалить, при следующем проходе найти, добавить, удалить и т.д., но это получается кастыль. Наверно можно сделать проще. Помогите! PS. Извените за нубский вопрос.

Потому, что index каждый раз у тебя возвращает первое вхождение подстроки в строке. Т.е у тебя фраза про твою информацию предоставлена начинается с 164 позиции в каждой найденной строке файла.

menangen ★★★★★
()
Ответ на: комментарий от menangen

Потому, что index каждый раз у тебя возвращает первое вхождение подстроки в строке. Т.е у тебя фраза про твою информацию предоставлена начинается с 164 позиции в каждой найденной строке файла.

Поправлю чуток: фраза в 164 позиции списка file, а не строки.

pi11 ★★★★★
()
def find_pattern_indices(file, pattern):
    s = open(file).read()
    i = s.find(pattern)
    
    while i >= 0:
        yield i
        i = s.find(pattern, i + len(pattern))

g = find_pattern_indices('log.txt', 'Информация предоставлена\n')
print(list(g))

Через регулярочки тоже можно.

А для чего тебе индекс понадобился, а?

anonymous
()
Ответ на: комментарий от anonymous

Мне показалось или я сейчас затупил?

anonymous
()

Тебе нужен именно индекс в файле, индекс в строке или номер строки?

Судя по for line in file: и if word in line, ты хочешь не индекс в файле, а номер строки? Потому что в твоём случае если в строке встречается дважды, код не будет работать. Если тебе нужен номер строки, то твой код можно исправить так:

word = 'Информация предоставлена\n'
file = open('log.txt').readlines()  # FIXME: `with open() as`
c = [n for n, line in enumerate(file) if word in line]
print(c)
Будут получены номера строк, в которых имеется исходная строка. Проверь, такой ли тебе нужен результат.   

Если же тебе всё же нужны именно индексы во всём файле, то смотри выше ответ анонимуса. Тебе не нужно readlines, тебе нужно read и рассматривать файл как строку. Если ты начинающий, и тебя смущает yield, то вот более топорный вариант:

FILENAME = 'log.txt'
WORD = 'Информация предоставлена\n'

with open(FILENAME) as f:
    data = f.read()

i = 0  # start from beginning of file
c = []
while True:
    i = data.find(WORD, i)
    if i == -1:
        break
    c.append(i)
    i += 1
print(c)

 

И присоединюсь к вопросу: а зачем тебе вообще этот индекс?

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

Спасибо за отыеты, сейчас попробую варианты. Мне нужен индекс, для того что бы от него потом отсчитать -4 индекса и получить уникальный номер из файла который там выше, эта структура в фале не меняется. То есть идея такая находим 'Информация предоставлена' получаем индекс от него высчитываем индекс -4 и по индесам печататем оба значения.

lexlex361
() автор топика
Ответ на: комментарий от lexlex361

«Уникальный номер» этот из 4 символов что ли? То есть, надо 4 символа, предшествующих «Информация предоставлена», и так каждый раз?

with open('log.txt') as f:
    data = f.read()
nums = [x[-4:] for x in data.split("Информация предоставлена")]
print(nums)

Также можно сделать это регэкспами.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 3)
Ответ на: комментарий от Psych218

Нет наверно не правильно выразился, вот ваш код:

word = 'Информация предоставлена\n'
file = open('log.txt').readlines()  # FIXME: `with open() as`
c = [n for n, line in enumerate(file) if word in line]
print(c)

вывод:[164, 194, 224] Я сейчас еще дописал только принт по найденысм параметрам:

word = 'Информация предоставлена\n'
file = open('log.txt').readlines()  # FIXME: `with open() as`
c = [n for n, line in enumerate(file) if word in line]
for i in c:
	print (file[i],file[i - 4])

И получаю практичеки то что нужно.

Информация предоставлена
 592

Информация предоставлена
 19465

Информация предоставлена
 19851

дальше только осталось вывод загнать в новую переменную и там дальше ее отправлять по почте.

lexlex361
() автор топика

А для чего загружать весь файл в оперативку?

vsemnazlo
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.