使用Python自動執行數據清理,一些問題

2024-05-16 09:57:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我要处理大约16000行数据。每一行都是一个事务记录,有几个部分。例如: 行=[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和小部件的那些。我想有一个非常简单的方法来做这个。感谢任何帮助!在


Tags: to数据idcloseif部件lineopen
1条回答
网友
1楼 · 发布于 2024-05-16 09:57:37

您要做的是创建一个字典,其中键是(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。在


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

^{pr2}$

它的运行结果似乎是正确的。在

相关问题 更多 >