LINUX.ORG.RU

Найти строку в файле

 ,


0

1

Всем привет, подскажите, где у меня ошибка?

Хочу из полученых строк понять, есть ли уже такая строка в логе. Если есть то вернуть 0, если нет, то дописать эту строку в лог и вернуть 1. Делаю так

def log_file(logline):
        if os.path.exists("log"):
                file = open("log", "r")
                for line in file.readlines():
                        if repr(logline) == repr(line):
                                return 0
                        else:
                                file.close()
                                file = open("log", "a")
                                file.writelines(logline+"\n")
                                file.close()
                                return 1
Оно все время сверяется по первой строке из файла, а остально не смотрит. Как мне пробежатся по каждой строке, а не только по первой?

★★★★★
def log(data):
    with open("log", "a+") as logfile:
        for line in logfile:
            if data == line.strip():
                return 0
        logfile.write("%s\n" % data)
        return 1
anonymous
()
Ответ на: комментарий от disee

а что именно у тебя вызвало подозрения? тут семантическая проблема, которую в пятницу вечером я не могу понять :( если бы был не правильный синтаксис, то питон бы сказал об этом, не пытаясь выполнить скрипт

autonomous ★★★★★
() автор топика

А что по Вашему должен делать этот код?;-) Тело цикла - если строки совпадают вернуть ноль, иначе дописать строку в конец и вернуть один... Вам тут ничего глаз не режет?;-)

AIv ★★★★★★
()

file.readlines() считывает сразу все строчки в память.

тогда уж можно сделать просто

if line in file.readlines():
 bla_bla # добавить строчку

только нужно понимать, что считанные строчки включают в себя \n

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

с питоном не дружу, но думаю что проблема в синтексисе for-а

А какой у фора должен быть синтексис, и что такое вообще синтексис? ВИкипедия молчит, гугль отсылает к какому то синтАксису, вот ведь зануда... ;-(

AIv ★★★★★★
()

и да, анонимус, как всегда, правильно подсказывает

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

я понимаю, что код делает. а спрашивал, как мне его изменить, чтобы он делал, то что я хотел :)

доброму анонимусу большое спасибо

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

Во, самое здравое предложение... Тогда уж

 
if line in [ l.strip() for l in open("file.log") ] : open("file.log").write(line+"\n") 

PS гребанный LORCODE...

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

я понимаю, что код делает. а спрашивал, как мне его изменить, чтобы он делал, то что я хотел :)

Для начала - перестать писать на питоне в С-стиле. Вы делаете слишком много лишних телодвижений, это ужасно выглядит.

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

извините, что задел ваши эстетические чувства :) я никогда не писал на С, на баше правда писал, а с питоном только 3-ий день дружу. вобщем постараюсь как можно скорее найти свой стиль :)

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

Во-первых, у вас не хватает «not» перед «in [...».
Во-вторых, open(«file.log»).write(...) вылетит с эксепшеном IOError
В-третьих, перестаньте писать на питоне в Perl-стиле.

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

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

Тьфу, по первым двум пунктам согласен полностью, виноват.

if not line in [ l.strip() for l in open("file.log") ] : open("file.log","a").write(line+"\n") 

По третьему - не согласен категорически. Питон позволяет писать лаконичный и прозрачный код, и этим надо пользоваться, а не наматывать портянки в 10 строк на пустом месте. Иначе нафига на питоне то писать;-)

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

Файлы и проч. закрываются по деструктору, при выходе из ф-ии. Если закрытие критично - есть ветки try/finally или with, но Ваша задача не тот случай явно.

И причем здесь вообще питон, если исходный алгоритм был неработоспособен?;-)

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

И причем здесь вообще питон, если исходный алгоритм был неработоспособен?;-)

эммм, потому что алгоритм на питоне? :)

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

Никогда не думал, что в «лаконичном и прозрачном коде», чтобы прочитать и записать в файл нужно 2 раза его открывать.

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

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

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

Да, в этом смысле Ваш вариант изящнее. Но для питона это вообще то не очень критично. Более того, вариант вида

line += '\n'
if not filter( line.__eq__, open("file.dat") ) : ...

может оказаться быстрее Вашего.

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

Вообще то алгоритм и его реализация на конкретном ЯП - это две большие разницы, наск я помню.

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

Вообще то алгоритм и его реализация на конкретном ЯП - это две большие разницы, наск я помню.

разные и чего?

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

И того, что если Вы пытаетесь закодить заведомо неправильный алгоритм на питоне, то проблемы в алгоритме, а не в реализации. Какой алгоритм Вы закодили я написал выше, Вы сказали что Вы это понимаете, т.е. Вас алгоритм устраивает?;-)

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

вобще-то я написал, что этот алгоритм меня не устраивает :) я знаю как его реализовать на баше, но не понимаю как на питоне. приблизительно в этом заключался мой вопрос.

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

Можно и так конечно... даже пожалуй нужно - он по идее тогда не должен весь файл читать, если строку найдет.

AIv ★★★★★★
()

Popen([«grep», ...

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

Напиши, пожалуйста, генераторное выражение для примера Alv. (Это не троллинг, мне действительно интересно). Заранее спасибо.

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

М? А что его писать, заменил квадратные скобки на круглые и всё. :-) Я подозреваю, что меня таки троллят. Если что, я говорил про этот пример:

if not line in [l.strip() for l in open("file.log")] : open("file.log" ,"a") .write(line+ "\n")
Соответственно, с ген. выражением это будет выглядеть как:
if not line in (l.strip() for l in open("file.log")): open("file.log" ,"a") .write(line+ "\n")
Профит понятен.

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