【问题标题】:Reading a File Line by Line in Python在 Python 中逐行读取文件
【发布时间】:2019-04-16 10:42:50
【问题描述】:

我对 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。

标签: python python-3.x file io


【解决方案1】:

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

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 中复制相同的内容。但我猜苹果和橙子不一样。让我回到绘图板。
  • 我还编辑了我的答案,以包括 如何使用一个类来做到这一点。看看这是否有意义。
【解决方案2】:

在使用上下文管理器(使用 open ....)时,您实际上并不需要一个类,也不需要 try 块或 file.close。

请阅读如何在 python 中使用类。一个函数会做这个

def read():

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

【讨论】:

    【解决方案3】:

    您通常不会将 main 方法放在一个类中。 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()
    

    【讨论】:

      【解决方案4】:

      这里有一些问题。

      首先是您声明了一个类,但随后不使用它(除了在自身内部)。您需要在类之外创建类的实例(或在其上调用类方法)才能对其进行实例化。

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2013-04-02
        相关资源
        最近更新 更多