使用Python自动化数据清理,一些问题

时间:2013-04-19 03:45:17

标签: python code-cleanup

我必须处理~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和小部件的内容。我假设有一种无限简单的方法可以做到这一点。任何帮助表示赞赏!

1 个答案:

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

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