【问题标题】:Reading a specific number of lines from a file without storing in memory?从文件中读取特定数量的行而不存储在内存中?
【发布时间】:2019-11-04 18:43:12
【问题描述】:

我有数据需要读取并使用 python 代码提取特定块,但文件可能有数千万行长且太大而无法存储在内存中,因此我只想提取我实际需要的数据分析。

文件格式如下:

4 # Number of lines per block
0 # Start of block 0
A line of data
A line of data
A line of data
A line of data
1 # Start of block 1
A line of data
A line of data
...

我遇到的问题是,一旦我找到我需要的特定块并将其读取到列表中,我的代码会继续读取和添加数据,直到文件末尾而不是该特定块的末尾。

这是我目前所拥有的:

required_block = 5
ilepath = file.txt
data = []

with open(filepath, 'r') as f:
    block_length = int(f.readline())
    for line in f:
        block = int(line)
        if block != required_block:
            for _ in range(block_length)
                next(f)
        else:
            break
    for line in f:
        data.append(line)

如果我尝试在最后一个“for”循环中添加一个范围,它只会一遍又一遍地读取当前行。

我哪里错了?

编辑:澄清一下,我只希望最后一个“for”循环运行 次。

【问题讨论】:

    标签: python python-3.x loops file


    【解决方案1】:

    如果您查看您的代码,您的最后一个 for 循环就是罪魁祸首。你告诉它无论如何都要附加所有内容。在你的第一个 for 循环中,你实际上并没有让它附加任何东西。所以基本上在第一个循环中它只是遍历数据,然后在第二个循环中它附加所有内容,因为附加在逻辑之外。

    我认为你想要的是这样的:

    for line in f:
            block = int(line)
            if block != required_block:
                next(f)
            else:
                for _ in range(block_length):
                    data.append(line)
    

    【讨论】:

      【解决方案2】:

      尝试将最后一个循环更改为:

      for _ in range(block_length):
          data.append(f.readLine())
      

      【讨论】:

        【解决方案3】:

        逐行读取文件:

        filepath = 'Iliad.txt'
            with open(filepath) as fp:
               line = fp.readline()
               cnt = 1
               while line:
                   print("Line {}: {}".format(cnt, line.strip()))
                   line = fp.readline()
                   cnt += 1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-27
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-05
          相关资源
          最近更新 更多