我有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
..
..
我想提取空行之间的数据,并将其写入新文件。很难知道文件中有多少空行(意味着你也不知道你将要写多少新文件;因此,写新文件似乎很难,因为你不知道你要写多少个新文件。有人能指导我吗?谢谢。我希望我的问题很清楚。
除非您的文件很大,否则请使用re将所有文件拆分为单独的部分,在2个或多个空白字符上进行拆分
import re
with open("in.txt") as f:
lines = re.split("s{2,}",f.read())
print lines
['#01textline1n1 2 3 4 5 6n2 3 5 6 7 3n3 5 6 7 6 4n4 6 7 8 9 9', '1 2 3 6 4 7n3 5 7 7 8 4n4 6 6 7 8 5', '3 4 5 6 7 8n4 6 7 8 8 9']
只需逐行迭代并在每次迭代时编写新文件即可。
读取文件不是数据挖掘。请选择更合适的标签。。。
在空行上拆分文件是微不足道的:
num = 0
out = open("file-0", "w")
for line in open("file"):
if line == "n":
num = num + 1
out.close()
out = open("file-"+num, "w")
continue
out.write(line)
out.close()
由于这种方法一次只读取一行,因此文件大小无关紧要。它应该以磁盘所能处理的速度处理数据,并且内存使用率几乎恒定。
Perl会有一个巧妙的技巧,因为您可以通过$/="nn";
将输入记录分隔符设置为两个换行符,然后像往常一样一次处理一个记录的数据。。。我在蟒蛇身上找不到类似的东西;但"空行拆分"的破解也不错。
这是一个开始:
with open('in_file') as input_file:
processing = False
i = 0
for line in input_file:
if line.strip() and not processing:
out_file = open('output - {}'.format(i), 'w')
out_file.write(line)
processing = True
i += 1
elif line.strip():
out_file.write(line)
else:
processing = False
out_file.close()
此代码使用processing
标志跟踪当前是否正在写入文件。当看到空行时,它会重置标志。代码还会在看到空行时创建一个新文件。
希望能有所帮助。