LINUX.ORG.RU

Трудная задача на Python[не для всех]

 , ,


0

1

Друзья, есть файл. В нем записи построчно.

Необходимо начать считывать файл до конца, и парсить по следующией схеме:

Если строка начинается на «new high», то сделать проверку в следующих 6 строках на существование определенной фразы «USB Mass Storage».

Если фраза есть, записываем все строки после «new high» (в переменную например) , до тех пор пока не встретиться фраза «no longer exist»

И так далее по всему файлу, фраз которых начинаются с new high много

задачи для ума

ну такого себе, очень условного ума

Dred ★★★★★
()

А почему на python обязательно?

А так понятно, что ты зачем-то хочешь парсить dmesg. А зачем, интересно?

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

Ну так и примени его. Это тривиально. Тебе нужно просто организовать построчный цикл и применить например регексп для проверки на наличие строк.

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

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

Потом напиши чо вышло и поможем дальше, если не осилишь.

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

Затем что это не задача для практического применения.

J ★★★★
()

Вообще регулярным выражением же можно, зачем построчно читать? В Python нет аналога read_file из Perl'а что ли? Или регэкспов с игнорированием переводов строк нет?

В смысле, на Perl итак в общем чтение файла целиком не сильно сложное:

my $fcont = do { open my $f, '<file.txt'; local $/=<$f> };

Но можно и так:

use File::Slurp qw(read_file);
my $fcont = read_file('file.txt');

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

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

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

Если я правильно понимаю задумку того, кто сие придумал, задача на конечные автоматы. Собственно, регулярные выражения - они же, просто формализованно описанное подмножество.

А точно на Perl нельзя? :)

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

Намекните

Так у него в задании одни намеки на решение, достаточно 2 раза погуглить если впервые увидел питон и один если 2й раз.

2Op

google://Python читать файл построчно
google://Python проверить наличие подстроки в строке

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

всё там есть. полно всего, пиши - не хочу. начать надо так:

with open('superlogfile.log') as log_file:
    all_my_lines = log_file.readlines() 
    # all_my_lines содержит список строк

sniper21 ★★★★★
()
Последнее исправление: sniper21 (всего исправлений: 1)
Ответ на: комментарий от logonsessons
if (str1.find("USB Mass Storage") >= 0):
    
    else:
    

Давай дальше сам попробуй.

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

на парах синтакис изучаем

Но ты на них не ходишь?

ashot ★★★★
()

Я не знаю Python 3, только Python 2, а так бы помог :(. Может, на Rust можно решение написать? Тогда, как пары закончатся, попробую прикинуть.

Virtuos86 ★★★★★
()
Ответ на: комментарий от i-rinat

Ой, нет, это сложно, наверное.

А может 18+ внутри.

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

да, я читаю файл по строчке нахожу совпадение, дальше если совпадение найдено то то сделать проверку в следующих 6 строках на существование определенной фразы «USB Mass Storage» . Вот как сделать такую проверку? А если есть вернутся на 6 строк назад и считать до тех пор пока не встретится строка «no longer exist»

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

Вот как сделать такую проверку?

Например, через регулярки.

если есть вернутся на 6 строк назад и считать до тех пор пока не встретится строка «no longer exist»

Предлагаю поменять алгоритм: как только встретишь «начальную фразу» начинай записывать строчки в переменную. Потом, если встретишь, «USB Mass Storage» в первых 6 строках, то продолжишь выполнение, если нет — вернёшь ошибку (не знаю, что там идеоматично возвращать в питоне).

То есть как-то так (disclaimer: код не проверялся, часть функций надо реализовать самому, код, скорее всего, не идеоматичен):

line = readline()
while line:
    if line.starts_with("..."):
        counter = 0
        var = []
        drop_var = True
        end_found = False
        while True:
            line = readline()
            var.append(line)
            if line.contains("USB...."):
                drop_var = False
            if line.contains("no such..."):
                end_found = True
            if end_found or counter >= 6:
               break
        # тут уже смотришь, из-за чего вышел, надо ли продолжать
        # считывать или просто вернуть var

anonymous
()

Я ничего в 3-м питоне не понимаю, тоже буду сидеть и ждать решения как все. Тот, кто ждёт, постится, слушает радио «Радонеж», тому боженька помогает, лично, точно-точно!

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

Забыл в второй while добавить counter += 1 при чтении строки.

anonymous
()

И сюда добрался этот хренов кликбейт.

no-such-file ★★★★★
()
Ответ на: комментарий от logonsessons

Ты до сих пор её не написал?

anonymous
()

Нет, даже простейшие конечные автоматы слишком сложны для простого смертного.

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

Я программист, задачу не читал, но она сложная. 100% нужен ПМ и аналитик на элаборэйшн.

fluorite ★★★★★
()

Задачка примитивная, в большом цикле читаешь строку, смотришь начало, если new high, то затем в другом вложенном цикле читаешь 6 следующих строк, пихая их в некоторую временную переменную/массив строк, ищешь USB Mass Storage, если нашел, то добавляешь в свою основную переменную/массив/список строк/что ты там собрался использовать для остальной части задачи со строками, затем в следующем вложенном цикле добавляешь в основную переменную по строке, пока не встретишь no longer exist и так до конца файла. По идее как-то так, но я особо не думал головой, когда это писал и тем более не проверял результат. Скорее всего от тебя ждут чего-то подобного, максимально простого и тривиального. Для такого даже теория конечных автоматов не нужна, т.к. всё тривиально. А вот описание файла не совсем полное, т.к. нет явного уточнения, может ли new high встретиться несколько раз до no longer exist.

peregrine ★★★★★
()

Я бы на VBA такое писал. Открываешь файл в экселе. Запускаешь макрос.

Заодно можно потом сразу графики красивые показать.

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

А кто потом пользоваться будет? У многих нет микрософтовского офиса. Даже винды нет.

Не жалко? Человек решит такую сложную задачу, и все коту под хвост

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

Надо мыслить ширше!

Задача трудная. Значит надо решать так, чтоб раз и навсегда. А то решат как попало, а потом начинается: а вот нам бы ещё чтоб с занесением в компьютер... а можно сразу на емэйл... а почему страницы не пронумерованы...

«Если делать, то по-большому!» (с)

frob ★★★★★
()

Тебе просто нужен seek().

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