Python прочитать файл построчно: Чтение файла построчно в Python

строки — Python. Построчное чтение из файла

Вопрос задан

Изменён 9 месяцев назад

Просмотрен 1k раз

Задание:

Файл содержит список операций сравнения вида :

2 < 3
5 > 1
7 == 8
10 != 10

Написать скрипт, который будет анализировать каждую строку, распознавать аргументы и оператор и генерировать файл out.txt, содержащий результаты данных выражений:

True
True
False
True

Мой код:

with open('C:\\abc\in.txt', 'r') as f:
        fc = f.readlines()
        for line in fc:
            open('C:\\abc\out.txt', 'w').write(str(bool(eval('line'))))
    f.close()

В файл выводит только единственное значение True вместо комбинации нескольких результатов

  • python
  • строки
  • файлы

2

Вы переписываете файл C:\\abc\out. txt в цикле для каждой строки входного файла. В итоге в выходном файле будет результат обработки последней строки входного файла.

Попробуйте так:

with open(r'd:\temp\in.txt', 'r') as f, open(r'd:\temp\out.txt', 'w') as out:
    for line in f:
        print(str(bool(eval(line))), file=out)

NOTE: использование eval() может быть очень опасным, лучше его вовсе не использовать.

4

Вариант без eval:

OPS = {
    ">":  lambda a, b: a > b,
    "<":  lambda a, b: a < b,
    "==": lambda a, b: a == b,
    "!=": lambda a, b: a != b,
}
with open(r'd:\temp\in.txt', 'r') as f, open(r'd:\temp\out.txt', 'w') as out:
    for line in f:
        a, op, b = line.strip().split()
        result = OPS[op](int(a), int(b))
        print(result, file=out)

2

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

python: чтение строк и работа с каждой из строк

Задать вопрос

Вопрос задан

Изменён 1 год 7 месяцев назад

Просмотрен 464 раза

Всем привет! Мне необходима работа со строками из файла. У меня есть файл bonus.py

, в нем содержится:

1
2
3

И есть файл test.py, в нем содержится:

import bonus
file = open('c://testper/bonus.py', 'r')
qwe = file.readlines()
print(qwe) # для считывания строк, что там вообще содержится
if qwe == '1':
    print('Sucs!(1)')
else:
    print('error')

Он выводит error, так как не обнаружил в файле bonus.py цифру 1. В print(qwe) выводится:

[‘1\n’, ‘2\n’, ‘3\n’]

Как сделать так, чтобы он читал ВСЕ строки, и в строках искал то число, которое необходимо для вывода ‘Sucs(1)’?

  • python
  • python-3.x
  • файлы

1

  1. Так как в файле bonus.py находятся цифры: 1, 2, 3, где каждая с новой строки, следовательно в списке ‘qwe’ после каждой цифры стоит ‘\n’, ‘\n’ обозначает перенос на след. строчку.
  2. В этой строчке if qwe == '1':
    вы сравниваете список со строкой, а не строку со строкой.

Вот один из вариантов решения:

import bonus
file = open(r'c://testper/bonus.py', 'r')
qwe = file.readlines()
print(qwe) # для считывания строк, что там вообще содержится
if '1\n' in qwe:
    print('Sucs!(1)')
else:
    print('error')

Вот еще более удобный:

import bonus
file = open(r'C:\Users\mihai\.spyder-py3/bonus.py', 'r')
qwe = [x.strip() for x in file.readlines()] # убираем '\n'
print(qwe) # для считывания строк, что там вообще содержится
if '1' in qwe:
    print('Sucs!(1)')
else:
    print('error')

4

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Чтение файла построчно в Python

Задавать вопрос

спросил

4 года, 4 месяца назад

Изменено 3 года, 10 месяцев назад

Просмотрено 23 тысячи раз

Я новичок в Python. Итак, я пробовал свой первый базовый фрагмент кода. Итак, я пытался прочитать файл и распечатать его построчно в Python. Вот мой код:

 класс ReadFile(объект):
    деф основной (я):
        прочитатьФайл = ЧитатьФайл()
        readFile.printData()
    def printData(я):
        имя_файла = "H:\\Рабочий стол\\TheFile.txt"
        пытаться:
            с открытым (имя файла, 'r') как f:
                значение = f.readline()
                печать (значение)
            е.закрыть()
        кроме исключения как ex:
            печать (бывший)
 

Теперь, когда я запускаю его, я не получаю никаких результатов. Поэтому я попытался отладить его. Я вижу, что элемент управления переходит от одного метода к другому (основной —> printData), а затем существует. Он ничего не выполняет в методе. Можете ли вы сказать мне, что я делаю неправильно здесь? Я новичок, поэтому было бы неплохо немного понять, почему код ведет себя таким образом.

  • python
  • python-3.x
  • файл
  • io

1

Если идея состоит в том, чтобы понять, как читать файл построчно, то все, что вам нужно сделать, это:

 с open(filename, 'r') как f:
  для строки в f:
    печать (строка)
 

Необычно размещать это в блоке try-except.

Возвращаясь к вашему исходному коду, есть несколько ошибок, которые, как я предполагаю, связаны с непониманием того, как классы определяются/работают в python.

Судя по тому, как вы написали этот код, вы, возможно, имеете опыт работы с Java. Я настоятельно рекомендую пройти один из множества бесплатных и действительно хороших онлайн-курсов по Python, предлагаемых на Coursera или EdX.


В любом случае, вот как бы я это сделал, используя класс:

 class ReadFile:
    def __init__(я, путь):
        self.path = путь
    деф print_data (я):
        с open(self.path, 'r') как f:
            для строки в f:
                печать (строка)
если __name__ == "__main__":
    читатель = ReadFile("H:\\Desktop\\TheFile.txt")
    читатель.print_data()
 

2

Вам действительно не нужен класс для этого и вам не нужен блок try или file.close при использовании диспетчера контекста (с открытым .

…).

Пожалуйста, прочитайте, как классы используются в python. Для этого подойдет функция

 def read():
    имя_файла = "C:\\Пользователи\\file.txt"
       с открытым (имя файла, 'r') как f:
          для строки в f:
             печать (строка)
 

вы обычно не помещаете основной метод в класс. Python не похож на Java или C#. весь код вне класса будет выполняться при загрузке файла.

вы создаете классы только тогда, когда хотите инкапсулировать некоторые данные с методами вместе в объект. В вашем случае похоже, что вам вообще не нужен класс, но если вы хотите его, вы должны явно создать и вызвать его, например:

 класс A:
    защита __init__(сам):
        печать('конструктор')
    защита взрыва (я):
        распечатать('взрыв')
# выполняется код вне класса (например, метод main в Java/C#)
а = А()
а.бэнг()
 

Здесь есть несколько проблем.

Во-первых, вы объявляете класс, но не используете его (кроме как внутри него). Вам нужно будет создать экземпляр класса вне класса (или вызвать для него метод класса), чтобы он был создан.

 класс ReadFile:
    деф print_data (я):
        ...
# Создать новый объект, который является экземпляром класса ReadFile
an_object = ЧитатьФайл()
# Вызвать метод print_data() для объекта an_object
an_object.print_data()
 

Теперь вам не нужно использовать классы для решения этой проблемы, так что вы можете игнорировать все это и просто использовать код, который у вас есть внутри вашего метода printData:

 имя файла = "H:\\Desktop\\TheFile.txt"
пытаться:
    с открытым (имя файла, 'r') как f:
        значение = f.readline()
        печать (значение)
# в этом нет необходимости, так как f допустимо только в
# область действия блока with
# f.закрыть()
кроме исключения как ex:
    печать (бывший)
 

Вы обнаружите, что это почти то, что вы хотите. Вам просто нужно изменить его, чтобы напечатать весь файл, а не только первую строку. Здесь вместо того, чтобы просто прочитать одну строку с помощью f.readline() , мы можем перебрать результат f. readlines() :

 имя файла = "H:\\Desktop\\TheFile.txt"
пытаться:
    с открытым (имя файла, 'r') как f:
        для значения в f.readlines(): # прочитать все строки
            печать (значение)
кроме исключения как ex:
    печать (бывший)
 

Как читать файл построчно в Python?

Существует ровно одна причина, по которой предпочтительнее следующее:

 с open('filename.txt') as fp:
    для строки в fp:
        печать (строка)
 

Мы все избалованы относительно детерминированной схемой подсчета ссылок CPython для сборки мусора. Другие, гипотетические реализации Python не обязательно закроют файл «достаточно быстро» без с блоком , если они используют другую схему для освобождения памяти.

В такой реализации вы можете получить сообщение об ошибке «слишком много файлов открыто» от ОС, если ваш код открывает файлы быстрее, чем сборщик мусора вызывает финализаторы для потерянных дескрипторов файлов. Обычным обходным путем является немедленный запуск GC, но это неприятный хак, и должен делать это для каждой функции , которая может столкнуться с ошибкой, в том числе в библиотеках. Какой кошмар.

Или вы можете просто использовать с блоком .

(Прекратите читать сейчас, если вас интересуют только объективные аспекты вопроса.)

Почему это не включено в протокол итератора для файловых объектов?

Это субъективный вопрос о дизайне API, поэтому у меня есть субъективный ответ, состоящий из двух частей.

На интуитивном уровне это кажется неправильным, потому что это заставляет протокол итератора делать две отдельные вещи — перебирать строки и , закрывать дескриптор файла — и часто плохая идея заставлять простую функцию выполнять два действия. В этом случае это особенно плохо, потому что итераторы относятся к содержимому файла квазифункциональным, основанным на значениях способом, но управление файловыми дескрипторами — это совершенно отдельная задача. Невидимое объединение обоих в одно действие вызывает удивление у людей, читающих код, и затрудняет анализ поведения программы.

Другие языки пришли к такому же выводу. Haskell ненадолго заигрывал с так называемым «ленивым вводом-выводом», который позволяет вам перебирать файл и автоматически закрывать его, когда вы доходите до конца потока, но в наши дни почти повсеместно не рекомендуется использовать отложенный ввод-вывод в Haskell, и Haskell пользователи в основном перешли к более явному управлению ресурсами, такому как Conduit, который ведет себя больше как блок с в Python.

На техническом уровне есть некоторые вещи, которые вы можете захотеть сделать с дескриптором файла в Python, которые не будут работать, если итерация закроет дескриптор файла. Например, предположим, что мне нужно дважды перебрать файл:

 с open('filename.txt') как fp:
    для строки в fp:
        ...
    fp.seek(0)
    для строки в fp:
        ...
 

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

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *