我有一个大型制表符分隔文件,包含大约 140 万行和 50 列。在对文件中包含的数据执行任何操作之前,我想将这个大文件拆分为大约几千个较小的文件。我的文件的第一列包含位置信息,我希望每个较小的文件都是基于此信息的特定间隔。在单独的列表中,我有我想要分割较大文件的每个间隔的开始和结束。这是执行此操作的代码部分,开始位置和停止位置包含在名为 start_L 和 stop_L 的列表中:
for i in range(len(id)):
out1=((file%s.txt)%(id[i]))
table=open('largefile.tsv',"r")
start=int(start_L[i])
stop=int(stop_L[i])
table.next()
temp_out=open(out1,"w")
reader=csv.reader(table,delimiter="\t")
for line in reader:
if int(line[0]) in range(start,stop):
for y in line:
temp_out.write(("%s\t")%(y))
temp_out.write("\n")
else:
if int(line[0]) > stop:
break
else:
pass
print "temporary file..." , id[i]
上面的代码实现了我想要的,但是速度非常慢。它可以在几分钟内处理前一百个左右的间隔,但随着每个间隔的过去,速度会呈指数级下降,因此需要几天的时间才能运行。有没有更快或更有效的方法来做到这一点?我认为问题在于它必须扫描整个文件才能在每次循环中找到指定间隔内的位置。
最佳答案
您的程序随着时间的推移变慢的原因是您正在为每个输出文件一遍又一遍地重新读取 CSV 文件。随着您查看的范围在 CSV 文件中向下移动,您需要为每个输出文件读取越来越多的数据(其中大部分数据您会跳过)。因此,性能呈指数下降。
您需要重新组织代码,以便仅按顺序读取 CSV 一次,并在循环中挑选出感兴趣的范围(并将它们写入文件)。仅当 CSV 按范围排序(您说的是)并且您的 start_L/stop_L 也相应排序时,这才有可能。
关于python - 在python中分割一个大的制表符分隔文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14758054/