在Python中逐行读取文件

5

我对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),然后退出。它不执行方法内的任何内容。您能告诉我在这里做错了什么吗?由于我是新手,因此对代码为什么以这种方式运行的一些见解也会很好。

你的主函数不应该在类定义内部。将其移动到类外部。首先,为什么要将ReadFile作为对象?更简单的方法是只有一个调用printData函数的主函数。你可以将文件名作为参数传递给printData。 - Tom Johnson
4个回答

19

如果这里的想法是要理解如何逐行读取文件,那么你需要做的就是:

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

在 try-except 代码块中放置这段代码并不是典型的做法。

回到你的原始代码,那里有几个错误,我认为这些错误可能源自于对 Python 中类的定义和工作方式的理解不够深入。

你编写代码的方式表明你可能来自 Java 背景。我强烈建议你参加 Coursera 或 EdX 上提供的众多免费且真正不错的在线 Python 课程之一。


无论如何,这是我使用类的方法:

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()

这很可能是真的。我擅长Java。所以我尝试在Python中复制相同的内容。但我猜苹果和橙子并不一样。让我重新开始吧。 - hell_storm2004
我还编辑了我的答案,包括如何使用类来完成。看看这是否有意义。 - Silver

1

您不需要为此编写一个类,也不需要使用try块或file.close,而是可以使用上下文管理器(With open....)。

请了解Python中类的用法。对于此问题,函数就足够了。

def read():

    filename = "C:\\Users\\file.txt"
       with open(filename, 'r') as f:
          for line in f:
             print(line)

1
这里有几个问题。
首先,你声明了一个类但没有使用它(除了在类内部)。你需要在类外创建一个实例(或调用类方法)才能实例化它。
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.readlines()的结果,而不是只读取单个行f.readline()
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)

1
通常情况下,您不会在类中放置主方法。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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接