Python вывод метода класса отличается каждый раз - PullRequest
0 голосов
/ 24 апреля 2020

Предположим, у меня есть текстовый файл с именем 'text.txt', который содержит:

Apple
Orange
Strawberry

Всего 3 строки, и у меня есть класс:

class ReadTextFile:
  def __init__(self, filename):
    self.filename = (open(filename, 'r'))

  def number_of_lines(self):
    num = 0

    for line in self.filename:
      line = line.strip("\n")
      num += 1

    return(num)

Когда я использую это класс для подсчета общего количества строк, при первой попытке он дает правильный ответ, который равен «3», но после этого он дает мне «0», если я не переопределю переменную «text»:

>>> text = ReadTextFile('text.txt')
>>> text.number_of_lines()
3
>>> text.number_of_lines()
0
>>> text.number_of_lines()
0
...
>>> text = ReadTextFile('text.txt')
>>> text.number_of_lines()
3
>>> text.number_of_lines()
0
...

Что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Ключ должен открывать файл каждый раз, когда вы вызываете метод number_of_lines, или, по крайней мере, искать в начале файла.

Объект files имеет что-то вроде маркеров (для позиций чтения и записи). После прочтения файла маркер перемещается на следующую строку для чтения. Однако, как только вы окажетесь в конце файла, они не будут сброшены в начало файла. Если вы попытаетесь прочитать снова, используя тот же файловый объект, вы не сможете ничего прочитать, пока не сбросите маркер, используя seek().

Попробуйте это:

class ReadTextFile:
  def __init__(self, filename):
    self.filename = filename

  def number_of_lines(self):
    num = 0

    with open(self.filename, 'r') as file:
        for line in file:
          num += 1

    return(num)

text = ReadTextFile('txt.txt')
print(text.number_of_lines())
print(text.number_of_lines())
print(text.number_of_lines())
0 голосов
/ 24 апреля 2020

Используйте self.filename.seek(0) для сброса указателя чтения файла.

Чтение: Почему я не могу дважды вызвать read () для открытого файла?

...