我正在运行一个脚本来将一些标题列恢复为CSV文件。它将带有标题列的原始文件作为字典并将它们重新绑定到丢失了标题列的文件中。
问题在于它非常缓慢。这些文件都是中等大小(约50mb),有200,000行乘96列。当我预览时,输出文件看起来正确。每10分钟增加大约200kb。
我在编码方面是一个绝对的菜鸟,所以任何有助于弄清楚脚本速度如此之慢的帮助都会受到赞赏。
hapinfile = file('file_with_header_columns', 'r')
hapoutfile = file('file_missing_header_columns.csv', 'r')
o = file('filescombined.txt', 'w')
dictoutfile={}
for line in hapoutfile:
a=line.rstrip('\n').rstrip('\r').split('\t')
dictoutfile[a[0]]=a[1:]
hapinfile.close()
for line in hapinfile:
q=line.rstrip('\n').rstrip('\r').split('\t')
g=q[0:11]
for key, value in dictoutfile.items():
if g[0] == key:
g.extend(value)
o.write(str('\t'.join(g)+'\n'))
hapoutfile.close()
o.close()
答案 0 :(得分:0)
对于初学者,您不需要第二部分中的内部循环。这是你要循环的字典,你应该只使用g [0]作为键来访问该值。这将为你节省一个庞大的字典循环,这个字典会发生在无标题文件中的每一行。如果需要,您可以检查g [0]是否在字典中以避免KeyErrors。
答案 1 :(得分:0)
由于嵌套的for
循环无用地一次又一次地掠过字典,所以它永远消失了。试试这个:
for line in hapinfile:
q=line.rstrip('\n').rstrip('\r').split('\t')
g=q[0:11]
if g[0] in dictoutfile:
g.extend( dictoutfile[g[0]] )
o.write(str('\t'.join(g)+'\n'))
答案 2 :(得分:-1)
from __future__ import with_statement # if you need it
import csv
with open('file_with_header_columns', 'r') as hapinfile,
open('file_missing_header_columns', 'r') as hapoutfile,
open('filescombined.txt', 'w') as outfile:
good_data = csv.reader(hapoutfile, delimiter='\t')
bad_data = csv.reader(hapinfile, delimiter='\t')
out_data = csv.writer(outfile, delimiter='\t')
for data_row in good_data:
for header_row in bad_data:
if header_row[0] == data_row[0]
out_data.writerow(data_row)
break # stop looking through headers
你似乎有一个非常不幸的问题,你必须做嵌套循环才能找到你的数据。如果你可以通过标题字段对CSV文件进行排序,那么你可以获得更高的效率。实际上,利用CSV模块并压缩所有内容。您可以使用break
,for
循环中有点奇怪,一旦找到您的标题,它将至少将您从搜索到第二个文件中“短路”。