Какой идеальный аналог в Python для «пока не EOF»
Чтобы прочитать текстовый файл на C или Pascal, я всегда использую следующие фрагменты для чтения данных до EOF:
Поэтому мне интересно, как я могу сделать это просто и быстро на Python?
Прокрутите файл, чтобы прочитать строки:
Файловые объекты являются итерируемыми и выдают строки до EOF. При использовании файлового объекта в качестве итерируемого используется буфер для обеспечения выполнения операций чтения.
Вы можете сделать то же самое со стандартным вводом (не нужно использовать raw_input() :
Как чинить SyntaxError
SyntaxError — это ошибка, которая легко может ввести в ступор начинающего программиста. Стоит забыть одну запятую или не там поставить кавычку и Python наотрез откажется запускать программу. Что ещё хуже, по выводу в консоль сложно сообразить в чём дело. Выглядят сообщения страшно и непонятно. Что с этим делать — не ясно. Вот неполный список того, что можно встретить:
- SyntaxError: invalid syntax
- SyntaxError: EOL while scanning string literal
- SyntaxError: unexpected EOF while parsing
Эта статья о том, как справиться с синтаксической ошибкой SyntaxError . Дочитайте её до конца и получите безотказный простой алгоритм действий, что поможет вам в трудную минуту — ваш спасательный круг.
Работать будем с программой, которая выводит на экран список учеников. Её код выглядит немного громоздко и, возможно, непривычно. Если не всё написанное вам понятно, то не отчаивайтесь, чтению статьи это не помешает.
Ожидается примерно такой результат в консоли:
Но запуск программы приводит к совсем другому результату. Скрипт сломан:
Ошибки в программе бывают разные и каждой нужен свой особый подход. Первым делом внимательно посмотрите на вывод программы в консоль. На последней строчке написано SyntaxError: invalid syntax . Если эти слова вам не знакомы, то обратитесь за переводом к Яндекс.Переводчику:
Первое слово SyntaxError Яндекс не понял. Помогите ему и разделите слова пробелом:
Теория. Синтаксические ошибки
Программирование — это не магия, а Python — не волшебный шар. Он не умеет предсказывать будущее, у него нет доступа к секретным знаниями, это просто автомат, это программа. Узнайте как она работает, как ищет ошибки в коде, и тогда легко найдете эффективный способ отладки. Вся необходимая теория собрана в этом разделе, дочитайте до конца.
SyntaxError — это синтаксическая ошибка. Она случается очень рано, еще до того, как Python запустит программу. Вот что делает компьютер, когда вы запускаете скрипт командой python script.py :
- запускает программу python
- python считывает текст из файла script.py
- python превращает текст программы в инструкции
- python исполняет инструкции
Синтаксическая ошибка SyntaxError возникает на четвёртом этапе в момент, когда Python разбирает текст программы на понятные ему компоненты. Сложные выражения в коде он разбирает на простейшие инструкции. Вот пример кода и инструкции для него:
- создать строку ‘Евгений’
- создать словарь
- в словарь добавить ключ ‘name’ со значением ‘Евгений’
- присвоить результат переменной person
SyntaxError случается когда Python не смог разбить сложный код на простые инструкции. Зная это, вы можете вручную разбить код на инструкции, чтобы затем проверить каждую из них по отдельности. Ошибка прячется в одной из инструкций.
1. Найдите поломанное выражение
Этот шаг сэкономит вам кучу сил. Найдите в программе сломанный участок кода. Его вам предстоит разобрать на отдельные инструкции. Посмотрите на вывод программы в консоль:
Вторая строчка сообщает: File "script.py", line 9 — ошибка в файле script.py на девятой строчке. Но эта строка является частью более сложного выражения, посмотрите на него целиком:
2. Разбейте выражение на инструкции
В прошлых шагах вы узнали что сломан этот фрагмент кода:
Разберите его на инструкции:
- создать строку ‘Имя ученика:
‘ - получить у строки метод format
- вызвать функцию с двумя аргументами
- результат присвоить переменной label
Так выделил бы инструкции программист, но вот Python сделать так не смог и сломался. Пора выяснить на какой инструкции нашла коса на камень.
Теперь ваша задача переписать код так, чтобы в каждой строке программы исполнялось не более одной инструкции из списка выше. Так вы сможете тестировать их по отдельности и облегчите себе задачу. Так выглядит отделение инструкции по созданию строки:
Сразу запустите код, проверьте что ошибка осталась на прежнему месте. Приступайте ко второй инструкции:
Строка format = template.format создает новую переменную format и кладёт в неё функцию. Да, да, это не ошибка! Python разрешает класть в переменные всё что угодно, в том числе и функции. Новая переменная переменная format теперь работает как обычная функция, и её можно вызвать: format(. ) .
Снова запустите код. Ошибка появится внутри format . Под сомнением остались две инструкции:
- вызвать функцию с двумя аргументами
- результат присвоить переменной label
Скорее всего, Python не распознал вызов функции. Проверьте это, избавьтесь от последней инструкции — от создания переменной label :
Запустите код. Ошибка снова там же — внутри format . Выходит, код вызова функции написан с ошибкой, Python не смог его превратить в инструкцию.
3. Проверьте синтаксис вызова функции
Теперь вы знаете что проблема в коде, вызывающем функцию. Можно помедитировать еще немного над кодом программы, пройтись по нему зорким взглядом еще разок в надежде на лучшее. А можно поискать в сети примеры кода для сравнения.
Запросите у Яндекса статьи по фразе “Python синтаксис функции”, а в них поищите код, похожий на вызов format и сравните. Вот одна из первых статей в поисковой выдаче:
Уверен, теперь вы нашли ошибку. Победа!
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Что такое идеальный аналог в Python для » пока не EOF»
чтобы прочитать текстовый файл на C или Pascal, я всегда использую следующие фрагменты для чтения данных до EOF:
таким образом, мне интересно, как я могу сделать это просто и быстро в Python?
6 ответов
цикл над файлом для чтения строк:
файловые объекты являются итерационными и дают строки до EOF. Использование объекта file в качестве iterable использует буфер для обеспечения выполнения чтения.
вы можете сделать то же самое с stdin (нет необходимости использовать raw_input() :
чтобы завершить картину, двоичные чтения могут быть сделаны с:
здесь chunk будет содержать до 1024 байт за раз из файла.
вы можете имитировать идиому C в Python.
для чтения буфера до max_size количество байт, вы можете сделать это:
или текстовый файл строка за строкой:
вам нужно использовать while True / break построить так как там нет теста eof в Python, кроме отсутствия байтов, возвращаемых из чтения.
в C, вы могли бы иметь:
однако вы не можете иметь это в Python:
это точно больше идиоматический в Python, чтобы сделать это:
идиома Python для открытия файла и чтения его строка за строкой:
файл будет автоматически закрыт в конце выше код ( with construct позаботится об этом).
наконец, стоит отметить, что line сохранить пустую строку. Это можно легко удалить с помощью:
хотя есть предложения выше для «делать это способом python», если кто-то хочет действительно иметь логику, основанную на EOF, то я полагаю, что использование обработки исключений-это способ сделать это —
или Ctrl-Z на raw_input() подсказка (Windows, Ctrl-Z Linux)
вы можете использовать ниже код, чтобы читать построчно до конца файла
вы можете использовать следующий фрагмент кода. readlines() считывает весь файл сразу и разбивает его на строки.