Я успешно выполнил поиск файла, используя следующий код:
fhand = open('mbox-short.txt')
for line in fhand:
if fhand.startswith("From"):
print(line)
Но если я попытаюсь прочитать файл в строке (inp) и выполнить тот же поиск, я не получу вывода:
fhand = open('mbox-short.txt')
inp = fhand.read()
for line in inp:
if inp.startswith('From:'):
print(line)
Я хотел бы знать, почему я не могу запросить свою строку inp. Предположим, что размер файла не слишком велик.
Если я могу использовать len() для запроса inp, почему я не могу использовать startswith()?
Основное различие заключается в том, что все содержимое существа находится в памяти одновременно, что делает его обработку построчно, требуя дополнительного шага для их разделения (что требует еще больше памяти).






Это работает, поскольку цикл for фактически читает строки из файла:
fhand = open('mbox-short.txt')
for line in fhand:
if line.startswith('From:'):
print(line)
Здесь fhand - это дескриптор файла, и когда вы перебираете его, мы получаем доступ к каждой строке в файле.
Здесь строка представляет собой строку и имеет метод .startswith, который мы можем применить, чтобы проверить, начинается ли она с какой-то конкретной фразы.
Это не работает:
fhand = open('mbox-short.txt')
inp = fhand.read()
for line in inp: # wrong this is char by char - not lines
if inp.startswith('From:'): # wrong since inp is the whole string
print(line)
fhand.read() возвращает весь блок текста в файле, и при итерации он возвращает каждый отдельный символ в блоке текста. Если вы используете startswith('From:'), это никогда не будет правдой, поскольку он сравнивает только отдельные символы.
Второй способ можно «исправить»:
fhand = open('mbox-short.txt')
inp = fhand.read()
for line in inp.splitlines():
if line.startswith('From:'):
print(line)
Теперь вы будете перебирать строки строки, а не символы, поскольку .splitlines() формирует список строк.
Не хотите объяснять голос против?
@dawg Доработал ответ, может будет полезнее
@dawg Пожалуйста, рассмотрите возможность оставить отзыв об измененном ответе
Я отредактировал и проголосовал за.
@dawg Спасибо за ваш ценный вклад :)
Итерация по строке дает односимвольные строки, а не строки. Рассмотрим
inp.splitlines().