python - 在 Python 中比较两个 CSV

标签 python

我正在 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/

相关文章:

python - 无法配置pyQt

python - Django + SQLite + ForeignKey ('self' ) = 迁移失败

python - Odoo:在 Thread 中调用 self.env 或其他模型

python - 我应该如何将 HTTP header 从字节解码为字符串?

python - "syscall-template.S: No such file or directory"是 GDB 还是我的程序的错误

python - 一个类的多个实例同时被覆盖? (Python)

python - 列表列表作为列表理解的结果

python - 如何从特定的 Django 模型实例中获取所有 RelatedManagers?

python - Elasticsearch python api GET 索引统计

python - 为什么这个 o(n) 三向集不相交算法比 o(n^3) 版本慢?