Уведомления

Группа в Telegram: @pythonsu

#1 Июль 28, 2016 19:40:07

pffpff
Зарегистрирован: 2016-07-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

длиннейшее слово в строке в многострочном файле

Всем ку!
Подскажите, необходимо спарсить файлы лога, вытащив из них имя домена. Всё, что я знаю про название домена - оно длинное, гораздо длиннее днс-имени. Каждая из строк представляет из себя конструкцию формата Днс1 Домен Днс2 Домен Днс3 Домен, то есть строки, состоящей из разных по длине слов, но где самым длинным слово является имя домена, соответственно логично вытащить его по длине.
Есть вот такой скрипт:

 with open("somefile.txt", "r") as o:
    for i in range(числострок):
        a = o.readline().split()
        print max(a, key = len)
который классно работает, если указывать число строк ручками.
Но как только я на это место вставляю выражения для вычисления общего количества строк perDl = len(o.readlines()) получая следующее:
 with open("somefile.txt", "r") as o:
    perDl = len(o.readlines())
    for i in range(perDl):
        a = o.readline().split()
        print max(a, key = len)
то тут же ловлю исключение ValueError: max() arg is empty sequence. Как это исправить и в чём суть косяка с точки зрения питоновской логики?
Заранее спасибо за помощь!

Офлайн

#2 Июль 29, 2016 02:20:10

papuas
Зарегистрирован: 2015-06-19
Сообщения: 159
Репутация: +  6  -
Профиль   Отправить e-mail  

длиннейшее слово в строке в многострочном файле

Задачу принципиально надо решить кодом ?
Если нет, то быстрее вытащить используя grep,awk,sed.
Приведите пример хотя бы одной фейковой строки.

Офлайн

#3 Июль 29, 2016 09:57:53

pffpff
Зарегистрирован: 2016-07-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

длиннейшее слово в строке в многострочном файле

papuas
Задачу принципиально надо решить кодом ?
Не особо принципиально, но у меня уже это вопрос принципа:3 Интересен механизм возникновения этого исключения.

papuas
Приведите пример хотя бы одной фейковой строки.
user1 somedomainworkplace ru user2 somedomainworkplace ru admin somedomainworkplace ru somedomainworkplace somedomainworkplace ru user1 somedomainworkplace ru ru somedomainworkplace user1 user2
Примерно так

Офлайн

#4 Июль 29, 2016 10:46:33

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

длиннейшее слово в строке в многострочном файле

pffpff
Не особо принципиально, но у меня уже это вопрос принципа:3 Интересен механизм возникновения этого исключения.
Ну, ты просто прочитал весь файл, когда вызвал .readlines(), а после этого внутренний указатель файла остался в конце. При этом список строк, возвращённый из .readlines(), ты использовал только для вычисления длины, хотя из него можно и строки брать. Но даже это не нужно, потому что читать файл целиком в память не принято.

Вот обычный код для построчного чтения файла в третьем питоне
 with open('file.txt', encoding='utf-8') as fin:
    for line in fin:
        print(line)

Во втором питоне можешь так написать
 with open('file.txt') as fin:
    for line in fin:
        print line
Но если есть возможность, надо третий питон поставить, потому что он лучше.



Офлайн

#5 Июль 29, 2016 10:50:24

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

длиннейшее слово в строке в многострочном файле

pffpff
Интересен механизм возникновения этого исключения.
 >>> print max([], key = len)
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
ValueError: max() arg is an empty sequence

Сравните какое количество строк вы руками задаете и что у вас в коде получается. :)
Посмотрите что будет если в начале файла вы вставите пустую строку.



Офлайн

#6 Июль 29, 2016 11:26:36

papuas
Зарегистрирован: 2015-06-19
Сообщения: 159
Репутация: +  6  -
Профиль   Отправить e-mail  

длиннейшее слово в строке в многострочном файле

pffpff
Днс1 Домен Днс2 Домен Днс3 Домен
и
pffpff
user1 somedomainworkplace ru user2 somedomainworkplace ru admin somedomainworkplace ru somedomainworkplace somedomainworkplace ru user1 somedomainworkplace ru ru somedomainworkplace user1 user2
различаются
если первое, то:
 # grep -Po '\w+(?=\sru)' test.txt
somedomainworkplace


 >>>import re
>>>input_data = '/home/test.txt'
>>> with open(input_data, 'r') as o:
...     for line in o:
...             m = re.findall('\w+(?=\sru)', line)
...             print m
... 
['somedomainworkplace', 'somedomainworkplace', 'somedomainworkplace', 'somedomainworkplace']
>>>

Отредактировано papuas (Июль 29, 2016 14:12:53)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version