Чтение файла построчно в Python - PullRequest
0 голосов
/ 13 ноября 2018

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

class ReadFile(object):

    def main (self):

        readFile = ReadFile()
        readFile.printData()

    def printData(self):

        filename = "H:\\Desktop\\TheFile.txt"

        try:
            with open(filename, 'r') as f:
                value = f.readline()
                print(value)

            f.close()

        except Exception as ex:
            print(ex)

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

Ответы [ 4 ]

0 голосов
/ 13 ноября 2018

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

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

class A:
    def __init__(self):
        print('constructor')

    def bang(self):
        print('bang')


# code outside of the class gets executed (like a 'main' method in Java/C#)
a = A()
a.bang()
0 голосов
/ 13 ноября 2018

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

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

def read():

    filename = "C:\\Users\\file.txt"
       with open(filename, 'r') as f:
          for line in f:
             print(line)
0 голосов
/ 13 ноября 2018

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

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

class ReadFile:
    def print_data(self):
        ...

# Create a new object which is an instance of the class ReadFile
an_object = ReadFile()
# Call the print_data() method on an_object
an_object.print_data()

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

filename = "H:\\Desktop\\TheFile.txt"

try:
    with open(filename, 'r') as f:
        value = f.readline()
        print(value)

# don't need to do this, as f is only valid within the
# scope of the 'with' block
#    f.close()

except Exception as ex:
    print(ex)

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

filename = "H:\\Desktop\\TheFile.txt"

try:
    with open(filename, 'r') as f:
        for value in f.readlines():  # read all lines
            print(value)

except Exception as ex:
    print(ex)
0 голосов
/ 13 ноября 2018

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

with open(filename, 'r') as f:
  for line in f:
    print(line)

Это не типично помещать это в блок, исключающий попытки.

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

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


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

class ReadFile:
    def __init__(self, path):
        self.path = path

    def print_data(self):
        with open(self.path, 'r') as f:
            for line in f:
                print(line)

if __name__ == "__main__":
    reader = ReadFile("H:\\Desktop\\TheFile.txt")
    reader.print_data()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...