将2个csv文件与python合并

将2个csv文件与python合并,python,csv,Python,Csv,我有2个csv文件,如下所示: File1.csv: Name, Email Jon, jon@email.com Roberto, roberto@email.com Mona, mona@email.com James, james@email.com File2.csv: Email mona@email.com james@email.com 我想要的是File1.csv而不是File2.csv,iex File3.csv(输出)应如下所示: File3.csv: Name, Ema

我有2个csv文件,如下所示:

File1.csv:

Name, Email
Jon, jon@email.com
Roberto, roberto@email.com
Mona, mona@email.com
James, james@email.com
File2.csv:

Email
mona@email.com
james@email.com
我想要的是File1.csv而不是File2.csv,iex File3.csv(输出)应如下所示:

File3.csv:

Name, Email
Jon, jon@email.com
Roberto, roberto@email.com
用Python编写代码的最简单方法是什么

dont_need_em = []
with open("file2.csv", 'r') as fn:
    for line in fn:
        if not line.startswith("Email"):
            dont_need_em.append(line.rstrip())

fw = open("file3.csv", 'w')

with open("file1.csv", 'r') as fn:
    for line in fn:
        if line.rstrip().split(", ")[1] not in dont_need_em: 
            fw.write(line.rstrip())
fw.close()
这应该可以做到,但我相信有更简单的解决办法


编辑:创建第三个文件

这是一个很好的方法(与上面的方法非常类似,但将剩余部分写入文件而不是打印:

Removed = []
with open("file2.csv", 'r') as f2:
    for line in f2:
        if not line.startswith("Email"):
           removed.append(line.rstrip())


with open("file1.csv", 'r') as f1:
    with open("file3.csv", 'w') as f3:
        for line in f1:
            if line.rstrip().split(", ")[1] not in removed:
                f3.write(line)
工作原理:
第一个块读取要筛选到列表中的所有电子邮件。接下来,第二个块打开您的原始文件并设置一个新文件以写入剩余内容。它读取第一个文件中的每一行,并将其写入第三个文件,只有当电子邮件不在您的列表中时,才能使用Pandas进行筛选

import pandas as pd
#Read two files into data frame using column names from first row
file1=pd.read_csv('File1.csv',header=0,skipinitialspace=True)
file2=pd.read_csv('File2.csv',header=0,skipinitialspace=True)

#Only return lines in file 1 if the email is not contained in file 2
cleaned=file1[~file1["Email"].isin(file2["Email"])]

#Output file to CSV with original headers
cleaned.to_csv("File3.csv", index=False)
如果您使用的是UNIX:

#! /usr/bin/env python
import subprocess
import sys

def filter(input_file, filter_file, out_file):
    subprocess.call("grep -f '%s' '%s' > '%s' " % (filter_file, input_file, out_file), shell=True)

以下内容应满足您的要求。首先将
File2.csv
读入要跳过的电子邮件地址的
集合中。然后逐行读取
File1.csv
,只写入不在跳过列表中的行:

import csv

with open('File2.csv', 'r') as file2:
    skip_list = set(line.strip() for line in file2.readlines()[1:])

with open('File1.csv', 'rb') as file1, open('File3.csv', 'wb') as file3:
    csv_file1 = csv.reader(file1, skipinitialspace=True)
    csv_file3 = csv.writer(file3)
    csv_file3.writerow(next(csv_file1))    # Write the header line

    for cols in csv_file1:
        if cols[1] not in skip_list:
            csv_file3.writerow(cols)
这将在
文件3.csv中为您提供以下输出:

姓名、电子邮件
乔恩,jon@email.com
罗伯托,roberto@email.com

File3.csv恰好是File1.csv的一个子集,那么您为什么需要合并?一个简单的方法是将file2读入列表,然后逐行读取File1,并将列表中不存在电子邮件的每一行都写入File3。尝试对其进行编码,如果遇到问题,请发布代码并寻求帮助。它已经被回答了很多时间。显示一些代码to使用,否则你可能会被伪装成复制品。见下面我的答案,我基本上使用了完全相同的方法