1

我必须处理约 16,000 行数据。每一行都是一个交易记录,有几个部分。例如:row= [ID, thing, widget]

我想做的很简单——对于每一行,将其与其余行一一进行比较。如果 A 行具有唯一 ID 和唯一小部件,我想将其写入输出文件。否则,我不需要它。(这个程序基本上为我自动清理数据。)这是我目前所拥有的:

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 和小部件的那些。我认为有一种非常简单的方法可以做到这一点。任何帮助表示赞赏!

4

1 回答 1

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]))

如果保留其原始顺序很重要,那么您可以OrderedDictcollections包中使用

您还可以清理该outfile.write行的编写方式,但它应该按原样工作。

最后,由于您正在读取/写入 csv(逗号分隔值)格式,因此您可以使用csv 模块


为了测试这一点,我写了一个脚本

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))

它似乎以正确的结果运行。

于 2013-04-19T04:07:02.493 回答