【问题标题】:Read a file line-by-line instead of read file into memory逐行读取文件而不是将文件读入内存
【发布时间】:2018-03-13 23:52:52
【问题描述】:

我在逐行读取文件时遇到了一些问题,而不是将文件读入内存。截至目前,我正在将文件读入内存,并且效果很好。但是,如果我尝试逐行读取文件,则在键入“print(B)”时只会得到零。我的问题是,有没有人有一个很好的命令来在 python 中逐行读取文件?我的代码如下所示:

def read(filename):

    with open(filename, 'r') as f: #open the file

        for line in f:

            A = sum(float(line) for line in f)

    with open(filename, 'r') as f:

            B = sum(float(line)**2 for line in f)

            print(B)

read('file.txt')

【问题讨论】:

  • 在您的示例中,您正在逐行阅读。
  • 这对我来说很好:see here
  • 请提供一些示例输入、您期望的结果以及您得到的结果。
  • 向我们展示示例输入和输出。
  • 您可以使用f.seek(0) 重置文件指针,而不是重新打开文件。

标签: python file


【解决方案1】:

这是一种只需要遍历文件一次的方法。你必须放弃漂亮的内置sum,自己动手:

def read(filename):
    A, B = 0, 0
    with open(filename) as f:
        for line in f:
            x = float(line)
            A += x
            B += x**2
    print(A)
    print(B)

还请注意,您实际上是在以一种奇怪的方式遍历文件的行,因为您有一个外循环 for line in f 和一个在 sum 中的内循环,它也运行在 for line in f 上。由于f 是一个迭代器,这意味着外循环只会到达第一行,内循环将消耗所有其他行并对它们求和,然后外循环没有其他需要处理并退出。通过注意print(B) 语句只执行一次,您应该能够看到这一点。

【讨论】:

    【解决方案2】:

    这适合你吗?

    with open(filename, 'r') as f:
        data = f.readlines()
    
    A = sum(float(line) for line in data)
    B = sum(float(line)**2 for line in data)
    

    【讨论】:

    • 谢谢!这正是我想要的。
    【解决方案3】:

    要返回文件开头,请使用seek

    def read(filename):
    
        with open(filename, 'r') as f: #open the file
    
            A = sum(float(line) for line in f)
            f.seek(0)
            B = sum(float(line)**2 for line in f)
    
                print(B)
    

    【讨论】:

    • 感谢您的帮助!您的意见很有用。
    【解决方案4】:

    原来的问题是你已经到了文件的末尾,需要回到开头再次迭代它。您可以在文件中进行一次迭代,将其分成两部分,然后求和。

    with open(filename) as f:
        A, B = map(sum, zip(*((x, x**2) for x in map(float, f))))
    

    【讨论】:

      猜你喜欢
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      相关资源
      最近更新 更多