我必须处理~16,000行数据。每行都是一个交易记录,包含几个部分。例如: row = [ID,thing,widget]
我想做的事情很简单 - 对于每一行,将其与其余行逐一进行比较。如果行A具有唯一ID和唯一小部件,我想将其写入outfile。否则,我不需要它。 (这个程序基本上可以自动为我清理数据。)这是我到目前为止所拥有的:
try:
infile=open(file1, 'r')
for line in infile:
line_wk=line.split(",")
outfile=open(file2, 'r')
for line in outfile:
line_wk2=line.split(",")
if line_wk[0]==line_wk2[0]:
if line_wk[2]!=line_wk2[2]: #ID is not unique, but the widget is
to_write=','.join(line_wk) #queued to write later
else:
to_write=','.join(line_wk) #queued to write later
if len(to_write)>0:
outfile.close()
outfile=open(file2, 'a')
outfile.write(to_write)
outfile.close()
outfile=open(file2, 'r')
infile.close()
outfile.close()
except:
print("Something went wrong.")
在一个小测试集上运行它,它保持在'try'块内,但只是写入所有内容,而不仅仅是具有唯一ID和小部件的内容。我假设有一种无限简单的方法可以做到这一点。任何帮助表示赞赏!
答案 0 :(得分:2)
您要做的是创建一个字典,其中键是(ID, widget)
的元组,值为thing
。字典键保证唯一。所以,你的代码看起来像这样。
uniques = {}
with open("yourfile.txt") as infile:
for line in infile:
ID, thing, widget = line.strip().split(',')
uniques[(ID, widget)] = thing
with open("output.txt", "w") as outfile:
for k, v in uniques.iteritems():
outfile.write("%s,%s,%s\n" % (k[0], v, k[1]))
如果保留原始订单非常重要,那么您可以使用collections包中的OrderedDict
您还可以清理outfile.write
行的写入方式,但它应该按原样运行。
最后,由于您正在阅读/编写csv(逗号分隔值)格式,因此您可以使用csv module。
为了测试这个,我写了一个脚本
import random
import string
IDS = range(1, 100)
widgets = ['ITEM_%s' % (i, ) for i in range(10)]
thing_chars = list(string.uppercase + string.lowercase)
def get_thing():
return "".join(random.sample(thing_chars, 10))
with open("yourfile.txt", "w") as out:
for i in xrange(0, 16000):
ID = random.choice(IDS)
widget = random.choice(widgets)
thing = get_thing()
out.write("%s,%s,%s\n" % (ID, thing, widget))
它似乎以正确的结果运行。