我正在 Python 中格式化 CSV 以获得所需的结果,但我的代码似乎无法正常工作。
我有第一个 CSV 文件,格式为:
2,a
1,a
4,a
5,a
3,a
1,a
3,b
2,b
1,a
第二个 CSV 文件的格式为:
1,a,123
1,a,234
2,a,456
2,b,345
3,a,789
3,b,232
4,a,987
由于第一个 CSV 文件未排序,因此第二个 CSV 文件相对于第一列按升序排序
我想要以下格式的输出:
2,a,456
1,a,123
4,a,987
5,a
3,a,789
1,a,234
3,b,232
2,b,345
1,a
如果在第二个 CSV 文件中找不到第一个 CSV 文件组合,则打印第一个 CSV 的结果,例如,如果第二个 CSV 文件中没有 5,a
,则只是 5,a
打印在其受尊重的位置。第一个 CSV 文件包含许多重复项,而在第二个 CSV 文件中,每一行都是唯一的。
这是我的代码
for (num,alpha) in first_csv:
value_found = True
for (num1,alpha1,num2) in second_csv:
if (num == num1 and alpha == alpha1):
csv_out += str(num) + ',' + str(alpha) + ',' + str(number)
value_found = False
if value_found:
count+=1
if count == 1:
csv_out += str(num) + ',' + str(alpha)
first_csv 和 secondary_csv 是我使用以下代码读取 CSV 文件后创建的元组:
with open('first_csv.csv') as f:
f.readline()
first_csv = tuple(csv.reader(f, delimiter=','))
with open('second_csv.csv') as f:
f.readline()
second_csv = tuple(csv.reader(f, delimiter=','))
但它没有打印所需的输出,我哪里做错了?
最佳答案
这会将第二个文件中的 num2
值收集到 deque
的字典中s。找到匹配项后,将使用 deque.popleft
删除它们,以便每个匹配项仅使用一次,顺序与它们在第二个文件中出现的顺序相同。
from collections import defaultdict, deque
with open('second_csv.csv') as f:
next(f) #skip header
dic = defaultdict(deque)
for num1,alpha1,num2 in csv.reader(f, delimiter=','):
dic[num1, alpha1].append(num2)
with open('first_csv.csv') as f, open('out.csv', 'wb') as fout:
next(f) #skip header
csv_out = csv.writer(fout)
for num,alpha in csv.reader(f, delimiter=','):
try:
num2 = dic[num,alpha].popleft()
csv_out.writerow([num,alpha,num2])
except IndexError:
csv_out.writerow([num,alpha])
deque
保留通过append
添加的项目的顺序以及通过popleft
删除的项目的顺序。dict
通过键(可以是元组)进行快速查找- a
defaultdict(deque)
是一个dict
,当您访问丢失的键时,它会自动创建一个空的deque
,因此您可以直接附加
到它。
关于python - 在 Python 中比较两个 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21251833/