2016-01-25 5 views
1

У меня есть 2 CSV файлы следующим образом:Объединить 2 CSV файлы с питоном

File1.csv:

Name, Email 
Jon, [email protected] 
Roberto, [email protected] 
Mona, [email protected] 
James, [email protected] 

File2.csv:

Email 
[email protected] 
[email protected] 

Что я хочу File1.csv без File2.csv, iex File3.csv (выход) должен выглядеть следующим образом:

File3.csv:

Name, Email 
Jon, [email protected] 
Roberto, [email protected] 

Что такое простейший способ закодировать это в Python?

+0

File3.csv случается подмножество File1.csv, так зачем вам сливаться? –

+0

Простым способом является чтение файла2 в список, а затем чтение файла1 по строке и запись каждой строки, где в списке нет файла в файле3. Попробуйте его кодировать, если вы застряли, опубликуйте свой код и попросите о помощи. – 576i

+0

На это уже ответил тонна времени. Покажите код, с которым вы работаете, или, возможно, вы будете разбиты как дубликаты. – Cyrbil

ответ

1
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() 

Это должно сделать это, но я уверен, что есть способ более простые решения

EDIT: Создайте третий файл

+0

Это действительно хорошо, но не создает третий файл –

+0

Это правда, плохо отредактируйте его :) –

+0

См. Мой ответ ниже, я использовал по существу точно такой же метод –

0

Вот хороший способ сделать это (это очень похоже на вышеизложенное, но пишет остаток в файл, а не печати:

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) 

Как это работает: Первый блок читает все письма, которые вы хотите, чтобы отфильтровать в литий ул. Затем второй блок открывает ваш исходный файл и устанавливает новый файл для записи оставшихся. Он читает каждую строку из первого файла и записывает их в третий файл только если электронная почта не в списке фильтрации

1

Использование панды вы можете сделать это:

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) 
0

Если вы под 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) 
0

Следующие должны делать то, что вы ищете. Сначала прочитайте File2.csv в set адресов электронной почты, которые необходимо пропустить. Тогда читайте 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) 

Это даст вам следующий вывод в File3.csv:

Name,Email 
Jon,[email protected] 
Roberto,[email protected] 
Смежные вопросы