我有BIG数据文本文件,例如:
#01textline1
1 2 3 4 5 6
2 3 5 6 7 3
3 5 6 7 6 4
4 6 7 8 9 9
1 2 3 6 4 7
3 5 7 7 8 4
4 6 6 7 8 5
3 4 5 6 7 8
4 6 7 8 8 9
..
..
答案 0 :(得分:8)
您不需要循环来完成您的目的。只需使用列表中的index
函数来获取两行的索引并获取它们之间的所有行。
请注意,我更改了您的file.readlines()
以删除尾随换行符。
(如果file.read().splitlines()
在一行数据中间结束,则使用read()
可能会失败。)
file1 = open("data.txt","r")
file2=open("newdata.txt","w")
lines = [ line.rstrip() for line in file1.readlines() ]
firstIndex = lines.index("#02textline2")
secondIndex = lines.index("#03textline3")
print firstIndex, secondIndex
file2.write("\n".join(lines[firstIndex + 1 : secondIndex]))
file1.close()
file2.close()
答案 1 :(得分:1)
每行末尾都有一个换行符,所以:
if line == "#03textline3":
永远不会成立,因为该行实际上是"#03textline3\n"
。为什么你没有使用与"#02textline2"
使用的语法相同的语法?它会起作用:
if "#03textline3" in line: # Or ' line == "#03textline3\n" '
break;
此外,您必须更正always_print = True
行的缩进。
答案 2 :(得分:0)
以下是我建议做的事情:
firstKey = "#02textline2"
secondKey = "#03textline3"
with open("data.txt","r") as fread:
for line in fread:
if line.rstrip() == firstKey:
break
with open("newdata.txt","w") as fwrite:
for line in fread:
if line.rstrip() == secondKey:
break
else:
fwrite.write(line)
这种方法利用了Python处理迭代器之类的文件这一事实。第一个for
循环遍历文件迭代器f
,直到找到第一个键。循环中断,但迭代器保持当前位置。当它被重新拾起时,第二个循环从第一个松开的地方开始。然后我们直接将您想要的行写入新文件,并丢弃其余的
<强>优点:强>
这不会将整个文件加载到内存中,只会存储firstKey
和secondKey
之间的行,并且脚本只读取secondKey
之前的行
不会多次查看或处理任何条目
上下文管理器with
是一种更安全的文件使用方式