过滤CSV上的唯一行

时间:2017-09-07 14:00:49

标签: python csv

请查看我的示例代码。我的input.csv中的State0是1101,state1是1100,state2是100.我想要的输出是写一行,它将从每个ID中选择行[2]中的一个代码。就像从ID 1那样它应该选择23456并写入它,从ID 2它应该选择45632并写入它并从ID 3它应该选择31276并写入它。我想为每个ID写一行包含所有三个代码。目前在执行代码后,我得到23456,其中ID 1是正确的,23412对于ID 2是错误的。它应该是45632,对于ID 3,它写的是正确的值31276.我想只为每个ID编写第一个代码。 Out.CSV是预期结果

import csv 
import glob

search_string = 'CAT'
state0 = '1101'
state1 = '1100'
state2 = '100'
corner1 = "TM"

with open("out.csv") as sample:
    reader = csv.reader(sample,delimiter="\t")
    header = 'ID', 'Code', 'state'

with open("out1.csv", "wb") as out1:
    writer = csv.writer(out1)
    writer.writerow(header)

    for path in glob.glob("out.csv"):
        if path == "out1.csv": continue
        with open(path) as fh:
            reader = csv.reader(fh)
           for row in reader:
               if corner1 in row:
                   if search_string in row:
                       if state0 in row:
                           readers = list(row)
                           readers.append(row[2])
                       elif state1 in row:
                           readers1 = list(readers)
                           readers1.append(row[2])
                       elif state2 in row:
                           readers2 = list(readers1)
                           readers2.append(row[2])
                           print(readers2)
                           writer.writerow(readers2)
                           break

Input.CSV

ID  Code    state
1   23456   1101
1   34567   1101
1   12354   1101
2   45632   1100
2   56798   1100
2   23412   1100
3   31276   100
3   98065   100
3   26987   100

Out.CSV(预期)

ID  Code    state           
1   23456   1101    23456   45632   31276

1 个答案:

答案 0 :(得分:0)

难以修复您尝试的破坏逻辑,但使用正确的逻辑编写一些清晰的代码很容易,因此我将详细解释我的代码。

您的预期输出

title
full_first_row code1 code2 code3

你需要:

  • 写入最后一行的空list
  • 一个空set来记忆已经遇到过哪些ID

我只是阅读行并检查行ID是否已经在set中。如果不在set中存储ID,则下次出现时无法计算。

如果id为1,则复制输出list中的整行。之后,将代码附加到此列表中。

从输入文件复制标题后,写下由此(奇异)数据组成的唯一行。

在下面找到一个使用内置列表而不是输入文件的自包含示例,但它很容易用实际文件句柄替换input_csv

input_csv = """ID   Code    state
1   23456   1101
1   34567   1101
1   12354   1101
2   45632   1100
2   56798   1100
2   23412   1100
3   31276   100
3   98065   100
3   26987   100""".splitlines()   

import csv

with open("out.csv","w",newline="") as output_csv:
    cw = csv.writer(output_csv,delimiter="\t")
    cr = csv.reader(input_csv,delimiter="\t")
    cw.writerow(next(cr))   # write title
    found_ids = set()
    row_to_write = []
    for row in cr:
      if row:
        the_id = row[0]
        if not the_id in found_ids:
            found_ids.add(the_id)
            if the_id=='1':
                row_to_write += row

            row_to_write.append(row[1])
    cw.writerow(row_to_write)