функция readlines() ведет себя не так, как функция read() в однострочном тексте

#python #python-3.x

Вопрос:

 file.txt
        No device found
**************************
    with open('file.txt', 'r') as f:
        if "No device found" in f.readlines():
            print('The requested wwn is not found on Brocade')
    
    output:
    Process finished with exit code 0
    
    
    with open('file.txt', 'r') as f:
        if "No device found" in f.read():
            print('The requested wwn is not found on Brocade')
    
    output:
    The requested wwn is not found on Brocade
    Process finished with exit code 0
 

прочитанные строки будут читаться по очереди за раз, верно? ЕСЛИ да, то почему он не читает единственную строку, присутствующую в файле?

Может кто-нибудь объяснить, чего мне здесь не хватает?

Спасибо!

Ответ №1:

Это связано с тем, что вы используете функцию readlines (), которая считывает все строки и возвращает список строк.

 with open('file.txt', 'r') as f:
        if "No device found" in f.readline():
            print('The requested wwn is not found on Brocade')
 

Это должно работать так, как задумано

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

1. Спасибо! Я не заметил, что там также есть функция readline ().. НО теперь, почему readlines() не работает? Даже функция readlines() считывает весь файл правильно?

2. или это то, что readlines() следует повторять, используя для строки в readlines() ?

3. @redpy Как я уже сказал, readlines возвращает список, поэтому первая строка имеет индекс 0, readlines()[0] даст вам первую строку. Если у вас есть только одна строка, она вернет что-то вроде [«содержимое строки 1»] и [«строка 1», «строка 2», «строка 3»], если у вас больше строк. readline() читает только следующую строку, поэтому в вашем приложении он читает только первую строку (это закончится на n tho). Это зависит от ваших потребностей

4. @redpy Да, точно, вы можете повторять строки чтения, но вы также можете это делать for line in file , хорошая часть строк чтения заключается в том, что вы можете хранить их в памяти и закрывать файл, это может занять много места при большом файле.

Ответ №2:

Сначала давайте уточним типы данных:

  • readlines() возвращает список строк (все строки в файле)
  • read() считывает все содержимое файла и возвращает одну строку
  • readline() также возвращает одну строку только текущей строки

Ключевое различие в вашем случае использования заключается в том, как in ключевое слово pythons работает по отношению к строке и списку:

  • Для строки проверяется, является ли указанная вами строка подстрокой.
  • Для списка это проверка того, является ли указанная вами строка точным совпадением с одним из элементов списка.

"No device found" Строка, которую вы ищете, не является точным совпадением в списке, это подстрока одной из строк в списке (на основе вашего входного файла, как указано в этой строке " No device found" ).