请查看我的示例代码。我的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
答案 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)