Попытка избавиться от «AttributeError: объект ‘int’ не имеет атрибута ‘startswith’ » при использовании цикла while

#python #for-loop #while-loop

#python #для цикла #цикл while

Вопрос:

Приведенный ниже цикл «for» успешно выводит все строки, начинающиеся с «From», из текстового файла:

 fhand = open('mbox-short.txt')
for line in fhand:
    if line.startswith('From:'):
        print(line)
 

Теперь я пытаюсь воспроизвести результат, используя «цикл while», как показано ниже:

 line_count =0       
line =0  

for i in fhand:  
    line_count = line_count  1
print("Total lines:", line_count)
        
while line < line_count: 
    if line.startswith("From:"):
        print(line)
    line = line  1
 

РЕЗУЛЬТАТ: AttributeError: объект ‘int’ не имеет атрибута ‘startswith’

Есть ли что-то, что я здесь делаю неправильно?

Комментарии:

1. startswith() Функция не может использоваться для целых чисел (вы инициализированы line как целое число ‘)

2. не могли бы вы объяснить, что вы хотите, чтобы ваш измененный код выводил?

3. Спасибо Vedank. Я хочу, чтобы код отображал список строк, начинающихся с «From». Уже упомянутый «цикл for» успешно выполнил это.

4. Хорошо, я вижу, где я ошибся, и я скорректировал код в соответствии с приведенным ниже. fhand = open(‘mbox-short.txt ‘) line_count =0 count =0 для строки в fhand: line_count = line_count 1 #print(«Всего строк:», line_count) в то время как count<line_count: если line.startswith(‘From:’): print(строка) count= count 1Теперь, хотя ошибок больше нет, я получаю пустой вывод.

Ответ №1:

Ваша переменная line=0 должна быть заменена на line1=0

Комментарии:

1. Хорошо, спасибо Engr1hmh, вместо этого я изменил назначение с line = 0 на count = 0 . Теперь в дополнение к переменной «count» я изменил блок while на приведенный ниже. в то время как count<line_count: если line.startswith(«From»): print (line) count= count 1 Теперь я вообще не получаю никаких выходных данных. Это довольно странно. Я ожидаю, что оператор print line напечатает все строки со строкой «From».

2. Вам нужна эта полная строка for line in fhand: if line.startswith('From:'): print(line) после while count< line_count:

3. Спасибо Engr1hmh, я уже упоминал, что для этого упражнения работает цикл «for»: fhand = open (‘mbox-short.txt ‘) для строки в fhand: если line.startswith(‘From:’): печать (строка) Вышеизложенное дает мне результаты, которые мне нужны без проблем. Теперь я хочу использовать цикл while сам по себе для печати моего вывода … за исключением того, что это задача, предназначенная только для цикла for .

4. Теперь я понял, в этой строке вашего кода while line < line_count: if line.startswith("From:"): print(line) line = line 1 замените line на i

Ответ №2:

В вашем первом коде строка соответствует строке .txt, которая будет строковым значением.

 fhand = open('mbox-short.txt') 
for line in fhand: 
    if line.startswith('From:'): 
       print(line)
 

В то время как в другом коде вы объявляете строку как значение int:

 line =0
 

Редактировать:
Обычно цикл for здесь наиболее эффективен, а не while. Но если вам вообще нужно попробовать использовать цикл while, это будет так:

 fhand = open("mbox-short.txt", "r")
# readlines() returns a list of strings on each line of .txt
lines = fhand.readlines()


# Calculate the number of lines
line_count = len(lines)

line = 0
while not line >= line_count:
    # Print each index element from the list which are lines from .txt
    print(lines[line])
    line  = 1

fhand.close()
 

Комментарии:

1. Спасибо Neeraj. Итак, я попытался изменить код, добавив другую переменную «count» fhand = open (‘mbox-short.txt ‘) line_count =0 count =0 для строки в fhand: line_count = line_count 1 print(«Всего строк:», line_count) в то время как count<line_count: если строка.начинается с(«From»): print (line) count= count 1 Что я пытался сделать, так это позволить консоли использовать элемент «line», уже инициализированный в предыдущем цикле «for», но теперь я не получаю ошибку и не получаю никаких результатов… Я получаю пустой вывод.

2. почему вы хотите использовать цикл while здесь? в этом вам нужно получить доступ к строке результата, который вы получаете после открытия файла .txt в режиме чтения. В любом случае я отредактировал ответ и включил, если вам вообще нужно использовать цикл while вместо for

3. Спасибо Neeraj, я просто хотел убедиться, что все, что может делать цикл for, может делать и цикл while. Но я ценю разъяснение.

4. рад, что смог помочь 🙂 дайте мне знать, если вам нужна более подробная информация по вашему запросу