【问题标题】:How to compare two CSV files in Python?如何在 Python 中比较两个 CSV 文件?
【发布时间】:2021-07-29 08:49:39
【问题描述】:

我在 file2.csv 中有两个名为 file1.csvfile2.csvCSV 文件只有一列只包含五条记录,并且在 file1.csv 我有三列包含超过一千条记录我想获取那些包含在 file2.csv 中的记录强> 例如这是我的 file1.csv

'A J1, Jhon1',jhon1@jhon.com, A/B-201 Test1
'A J2, Jhon2',jhon2@jhon.com, A/B-202 Test2
'A J3, Jhon3',jhon3@jhon.com, A/B-203 Test3
'A J4, Jhon4',jhon4@jhon.com, A/B-204 Test4
.......and more records

在我的 file2.csv 中,我现在只有 5 条记录,但未来可能会很多

A/B-201 Test1
A/B-2012 Test12
A/B-203 Test3
A/B-2022 Test22

所以我必须在 index[2]index[-1]

从我的file1.csv 中查找记录

这就是我所做的,但它没有给我任何输出它只是返回空列表

import csv 

file1 = open('file1.csv','r')
file2 = open('file2.csv','r')

f1 = list(csv.reader(file1))
f2 = list(csv.reader(file2))


new_list = []

for i in f1:
  if i[-1] in f2:
     new_list.append(i)

print('New List : ',new_list)

它给了我这样的输出

New List :  []

如果我做错了什么请帮助纠正我。

【问题讨论】:

  • zip() 盲目地将元素按照它们在源文件中出现的顺序进行配对。它不会帮助您找到两个文件之间的匹配项。要查找匹配项,您基本上需要将列表 1 中的所有元素与列表 2 中的所有元素进行比较。
  • 我以为我已经给了你这个想法:你基本上需要将列表 1 中的所有元素与列表 2 中的所有元素进行比较
  • 你好@Tomalak 检查我已经删除了 zip 但我仍然没有得到任何输出
  • 您不应该“删除zip()”。您应该将列表 1 中的所有元素与列表 2 中的所有元素进行比较。首先,编写一个嵌套循环。
  • 你会如何在纸上做到这一点?写下步骤。现在用它来编写你的代码。

标签: python python-3.x csv


【解决方案1】:

方法一:pandas

使用pandas 可以相对轻松地完成此任务。 DataFrame documentation here.

示例:

在下面的示例中,两个 CSV 文件被读入两个 DataFrame。使用匹配列上的内连接合并 DataFrame。

输出显示合并后的结果。

import pandas as pd

df1 = pd.read_csv('file1.csv', names=['col1', 'col2', 'col3'], quotechar="'", skipinitialspace=True)
df2 = pd.read_csv('file2.csv', names=['match'])

df = pd.merge(df1, df2, left_on=df1['col3'], right_on=df2['match'], how='inner')

quotecharskipinitialspace 参数作为file1 中的第一列被引用并包含逗号,并且在最后一个字段之前的逗号后面有前导空格。

输出:

    col1            col2            col3
0   A J1, Jhon1     jhon1@jhon.com  A/B-201 Test1
1   A J3, Jhon3     jhon3@jhon.com  A/B-203 Test3

如果您选择,可以轻松地将输出写回 CSV 文件,如下所示:

df.to_csv('path/to/output.csv')

有关其他 DataFrame 操作,请参阅上面链接的文档。


方法2:核心Python

以下方法不使用任何库,仅使用核心 Python。

  1. 将来自file2 的匹配读入列表。
  2. 遍历file1 并搜索每一行以确定最后一个值是否与file2 中的项目匹配。
  3. 报告输出。

任何后续数据清理(如果需要)将取决于您的个人要求或用例。

示例:

output = []

# Read the matching values into a list.
with open('file2.csv') as f:
    matches = [i.strip() for i in f]

# Iterate over file1 and place any matches into the output.
with open('file1.csv') as f:
    for i in f:
        match = i.split(',')[-1].strip()
        if any(match == j for j in matches):
            output.append(i)

输出:

["'A J1, Jhon1',jhon1@jhon.com, A/B-201 Test1\n",
 "'A J3, Jhon3',jhon3@jhon.com, A/B-203 Test3\n"]

【讨论】:

  • 你好@S3DEV我不想使用panadas你能提供没有panadas的解决方案
  • 请查看编辑后的帖子。我可以为您的下一个问题推荐,请在问题本身中设置任何诸如此类的限制。非常感谢,谢谢。
  • 您好@S3DEV 感谢您在我尝试打印输出时回复我的评论,它没有给我输出它给我一个空列表
  • 好的。检查您的源数据并检查match == j 的输出(插入一些print 语句进行调试)。可能有一些前导/尾随空格导致相等测试失败。源数据可能需要进行一些清理以匹配您陈述的情况。
  • 太好了,很高兴听到它!乐于助人。
猜你喜欢
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
相关资源
最近更新 更多