![](/img/trans.png)
[英]Reading certain lines from a file in python without loading it in memory
[英]Reading a specific number of lines from a file without storing in memory?
我有数据需要使用 python 代码读取和提取特定块,但文件可能有数千万行长,而且太大而无法存储在 memory 中,所以我只想提取我实际需要分析的数据。
文件格式如下:
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”循环运行 <block_length> 次数。
如果您查看您的代码,您的最后一个 for 循环是罪魁祸首。 无论如何,您都在告诉 append 一切。 在您的第一个 for 循环中,您实际上根本没有 append 任何东西。 所以基本上在第一个循环中它只是遍历数据,然后在第二个循环中它附加所有内容,因为 append 不在逻辑范围内。
我认为你想要的是这样的:
for line in f:
block = int(line)
if block != required_block:
next(f)
else:
for _ in range(block_length):
data.append(line)
尝试将最后一个循环更改为:
for _ in range(block_length):
data.append(f.readLine())
逐行读取文件:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.