Для числа, превышающего x, рассчитывайте на определенное место в строке

#python #count #txt

Вопрос:

Я пытаюсь найти число выше 300 в строке и хочу его посчитать.

линии выглядят так:

 181.15.193.19 - - [25/Mar/2021:07:10:52  0100] "GET /login HTTP/1.1" 200 2347
104.236.212.203 - - [25/Mar/2021:03:13:47  0100] "GET / HTTP/1.1" **302** 386
 

Я пытаюсь сосчитать все числа выше 300 в месте 302.
Но, как и ожидалось, он будет считать первые 2347, если вы пересчитаете всю строку, а это не то место, которое нужно считать.

 content = R_read_file()
wordcount = 0
my_word = " 300"
for line in inhoud:
    if my_word in line:
        wordcount  = 1
print(wordcount)
return
 

Это работает, но не будет показывать все цифры выше 300. Он просто подсчитывает 300, и он также будет считаться, если 300 находится на втором месте.

Комментарии:

1. Похоже на журнал веб-сервера. Вероятно, существует множество примеров анализа журналов веб-серверов и даже, возможно, библиотек с открытым исходным кодом, чтобы сделать это за вас должным образом. Тем не менее, если код ответа HTTP всегда является предпоследним маркером во входных данных, вы можете просто разделить его на пробелы, извлечь значение из токенов[-2], а затем проанализировать до int, а затем сравнить с 300.

Ответ №1:

Вам нужно будет разделить линию и взять только ту часть, которую вы собираетесь сравнивать:

 line.split()
 

Он разделит строку, в которой найдет пробелы, вы можете изменить параметр split() для любого символа в зависимости от необходимости.

Затем вы посмотрите, всегда ли число, которое вы ищете, находится в одной и той же позиции, поскольку мы разделили его на основе пробелов, позиция означает то же самое, что и количество слов. Глядя на ваши примеры, позиция числа равна 8, или, если вы предпочитаете -2 (обратный подсчет)

Вам также нужно будет убедиться, что число является целым числом

 number = int(line[-2])
 

Вам не понадобится строка «my_word», так как теперь вам просто нужно сравнить:

 if number > 300:
    wordcount  = 1
 

Obs: Если вы также хотите посчитать числа, равные 300, просто поместите >= в оператор IF.

Я очень надеюсь, что помог, извините за любую английскую ошибку, я все еще учусь 🙂

Комментарии:

1. Не могу понять, что и куда положить. Это то, что у меня есть сейчас. Не уверен, куда поместить строку.split() content = R_read_file() количество слов = 0 число = int(строка[8]) для строки в inhoud: если число >= 300: количество слов = 1 печать(количество слов) возврат

Ответ №2:

Ответы основаны на предположении, что вы можете фильтровать/перебирать строку строки и хотите подсчитать количество чисел выше 300

решение:

 from collections import Counter

string_data = """181.15.193.19 - - [25/Mar/2021:07:10:52  0100] "GET /login HTTP/1.1" 200 2347 
104.236.212.203 - - [25/Mar/2021:03:13:47  0100] "GET / HTTP/1.1" **302** 386"""
# split data 
split_data = string_data.split(" ")
# alue to check against
VALUE_ABOVE = 300
# filter number above 300
values = [value for value in split_data if  value.isnumeric() and int(value) > VALUE_ABOVE]

print(values)
print(dict(Counter(values)))
 

Выход:

 ['2347', '386']
{'2347': 1, '386': 1}
 

Комментарии:

1. Это сработало бы, но я хочу, чтобы оно не учитывало второе число. Только первое 3-значное число.

2. пожалуйста, поделитесь некоторыми ожидаемыми результатами

Ответ №3:

Я решил свою проблему вот так:

     with open('D:/file.log', 'r') as f:
    lines: list[str] = f.readlines()
import re
count = 0
for line in lines:
    found = re.search(r'(s[3-9][0-9][0-9]s)', line)
    result = int(found.group(0)) if found else ""
    if found:
        count  = 1

print(count")
return