Найти - Пользователи
Полная версия: длиннейшее слово в строке в многострочном файле
Начало » Python для новичков » длиннейшее слово в строке в многострочном файле
1
pffpff
Всем ку!
Подскажите, необходимо спарсить файлы лога, вытащив из них имя домена. Всё, что я знаю про название домена - оно длинное, гораздо длиннее днс-имени. Каждая из строк представляет из себя конструкцию формата Днс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. Как это исправить и в чём суть косяка с точки зрения питоновской логики?
Заранее спасибо за помощь!
papuas
Задачу принципиально надо решить кодом ?
Если нет, то быстрее вытащить используя grep,awk,sed.
Приведите пример хотя бы одной фейковой строки.
pffpff
papuas
Задачу принципиально надо решить кодом ?
Не особо принципиально, но у меня уже это вопрос принципа:3 Интересен механизм возникновения этого исключения.

papuas
Приведите пример хотя бы одной фейковой строки.
user1 somedomainworkplace ru user2 somedomainworkplace ru admin somedomainworkplace ru somedomainworkplace somedomainworkplace ru user1 somedomainworkplace ru ru somedomainworkplace user1 user2
Примерно так
py.user.next
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
Но если есть возможность, надо третий питон поставить, потому что он лучше.
doza_and
pffpff
Интересен механизм возникновения этого исключения.
 >>> print max([], key = len)
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
ValueError: max() arg is an empty sequence

Сравните какое количество строк вы руками задаете и что у вас в коде получается. :)
Посмотрите что будет если в начале файла вы вставите пустую строку.
papuas
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']
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB