Ошибка атрибута в Python: объект 'list' не имеет атрибута 'split' - PullRequest
2 голосов
/ 14 июля 2020

Я пытаюсь написать код, который извлекает временные коды из строк, начинающихся с «From». Пример: «От Стивена. marquard@uct.ac.za Сб, 5 января, 09:14:16 2008», а затем разбивает временной код на часы и секунды.

fhand = open('mbox-short.txt')

for line in fhand :
    line = line.rstrip()
    if not line.startswith('From') : continue
    words = line.split()
    time = words[5:6]
    hrs = time.split(':')
    print(hrs[1])
    print(hrs[2])

Когда я компилирую свой код - я получаю трассировка (Ошибка атрибута: 'list' object has no attribute 'split'). Если я изменю свой код, чтобы сделать то же самое для электронной почты:

fhand = open('mbox-short.txt')

for line in fhand :
    line = line.rstrip()
    if not line.startswith('From') : continue
    words = line.split()
    time = words[1]
    hrs = time.split('@')
    print(hrs[1])

, все в порядке - программа работает правильно (разбивает электронные письма на логины и домены). Что не так с первым кодом?

Ответы [ 3 ]

2 голосов
/ 14 июля 2020

Добро пожаловать в SO!

Во-первых, списки не имеют свойства под названием 'split'. Однако строки делают!

Это означает, что в первом примере вы пытаетесь разделить список, но во втором примере вы разделяете строку. Это потому, что выполнение words[5:6] возвращает список, но получение первого элемента из списка строк возвращает строку. (words[1])

Если вы хотите преобразовать список в строку, подумайте об использовании "".join(mylist). Прочтите эту статью на W3Schools для получения дополнительной информации о том, как использовать join.

1 голос
/ 15 июля 2020

Попробуйте следующее:

fhand = open('mbox-short.txt')

for line in fhand :
    line = line.rstrip()
    if not line.startswith('From') : continue
    words = line.split()
    time = words[5]
    hrs = time.split(':')
    print(hrs[1])
    print(hrs[2])
1 голос
/ 14 июля 2020

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

fhand = open('mbox-short.txt')

for line in fhand :
    line = line.rstrip()
    if not line.startswith('From') : continue
    words = line.split()
    time = words[5:6]
    for elem in time:
        hrs = time.split(':')
        print(hrs[1])
        print(hrs[2])
...