python - 如何在 Python 中比较两个 CSV 文件?
问题描述
我在file2.csv中有两个名为file1.csv和file2.csv的CSV文件,只有一列只包含五条记录,而在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 中,我现在只有五条记录,但将来可能会有很多
A/B-201 Test1
A/B-2012 Test12
A/B-203 Test3
A/B-2022 Test22
所以我必须从我file1.csv
的 at index[2]或index[-1]中查找记录
这就是我所做的,但它没有给我任何输出它只是返回空列表
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 : []
如果我做错了什么,请帮助纠正我。
解决方案
方法一:pandas
使用pandas
. DataFrame 文档在这里。
例子:
在下面的示例中,两个 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')
quotechar
和skipinitialspace
参数用作被引用的第一列并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。
file2
将匹配项从列表中读取。- 遍历
file1
并搜索每一行以确定最后一个值是否与file2
. - 报告输出。
任何后续数据清理(如果需要)将取决于您的个人要求或用例。
例子:
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"]
推荐阅读
- r - R的'randomForest'库的'rfcv()'函数中的'mtry'
- java - 如果选中某些按钮,则加载不同的场景
- delphi - delphi (RIO 10.3) 可以在运行时访问组件图标(从包二进制资源?)
- angular - 在 FormData 中上传文件时 HttpHeaders 的 ContentType
- yeoman - 使用 yeoman 生成的代码创建的 .yo-repository 目录的目的是什么?
- java - 观察相机正在对焦 || !isFocusing 用于 androidx.camera.core.Camera
- python - 如何判断我的模型是否过拟合?99.96% 准确率
- terraform - Terraform aws_ssm_parameter null/empty with ignore_changes
- google-chrome - 使用 puppeteer 启用 chrome SafeBrowsing 错误
- python-3.x - 将一个巨大的字符串转换为数据框中的 Nan 值