2013-03-27 2 views
0

Мне было предложено выйти из моей зоны комфорта и использовать питон с небольшим опытом и теперь я застрял. Я пытаюсь сравнить два файла CSV (fileA.csv и fileB.csv) и добавить любые отсутствующие строки пользователя в файлA.csv из fileB.csv. Единственными полями, с которыми я могу сравнить, являются имена и фамилии пользователя (в данном случае это строка [0] и строка [2] из каждого файла).Сравнение двух файлов CSV на основе конкретных данных в двух столбцах

С моей точки зрения, вы не можете добавлять информацию к файлу, который у вас в настоящее время открыт, поэтому я открыт для предложений, не создавая третий файл (если это возможно). Ниже я на правильном пути, но есть много данных, поэтому мне понадобится цикл. Пожалуйста помоги.

import csv 
reader1 = csv.reader(open('fileA', 'rb'), delimiter=',', quotechar='|') 
row1 = reader1.next() 
reader2 = csv.reader(open('fileB', 'rb'), delimiter=',', quotechar='|') 
row2 = reader2.next() 


##For Loop... 

     if (row1[0] == row2[0]) and (row1[2] == row2[2]): 
       ## Compare next 
     else: 
       ## Append entire row to fileA.csv 

Пример FileA.csv:

John,Thomas,Doe,some,other,stuff 
Jane, ,Smith,some,other,stuff 

Пример FileB.csv:

John, ,Doe,other,personal,data 
Jane,Elizabeth,Smith,other,personal,data 
Robin,T,Williams,other,personal,data 

Единственная строка, которая должна добавляемых из FILEB к FILEA завершения строки Робин так, чтобы FileA выглядит так:

DesiredR esult_FileA:

John,Thomas,Doe,some,other,stuff 
Jane, ,Smith,some,other,stuff 
Robin,T,Williams,other,personal,data 

ответ

1

Хранить информацию, находящуюся в файле A в памяти сначала, в комплекте.

Затем заново файл А в режиме добавления, и цикл по файловой B. Любое имя из В не найден в наборе, а затем может быть добавлена ​​в файл A:

csv_dialect = dict(delimiter=',', quotechar='|') 
names = set() 
with open('fileA', 'rb') as file_a: 
    reader1 = csv.reader(file_a, **csv_dialect) 
    next(reader1) 
    for row in reader1: 
     names.add((row[0], row[2])) 

# `names` is now a set of all names (taken from columns 0 and 2) found in file A. 

with open('fileA', 'ab') as file_a, open('fileB', 'rb') as file_b: 
    writer = csv.writer(file_a, **csv_dialect) 
    reader2 = csv.reader(file_b, **csv_dialect) 
    next(reader2) 
    for row in reader2: 
     if (row[0], row[2]) not in names: 
      # This row was not present in file A, add it. 
      writer.writerow(row) 

Комбинированный with линии требует Python 2.7 или новее. В более ранних версиях Python, просто гнездятся два заявления:

with open('fileA', 'ab') as file_a: 
    with open('fileB', 'rb') as file_b: 
     # etc. 
+0

Является ли этот синтаксис правильно? file_a, open ('fileB', 'rb') as file_b: – justin

+0

@justin: он находится в Python 2.7. В более ранних версиях просто вставьте два (так что сделайте их отдельными строками и отступом на один уровень дополнительно). –

+0

@ DSM: Спасибо за исправление. –

0

Вы можете попробовать pandas, которые могут помочь вам справиться с CSV-файлов проще, и, кажется, его более читабельным:

import pandas as pd 

df1 = pd.read_csv('FileA.csv', header=None) 
df2 = pd.read_csv('FileB.csv', header=None) 


for i in df2.index: 
    # Don't append if that row is existed in FileA 
    if i in df1.index: 
     if df1.ix[i][0] == df2.ix[i][0] and df1.ix[i][2] == df2.ix[i][2]: continue 

    df1 = df1.append(df2.ix[i]) 

df1.to_csv('FileA.csv', index=None, header=None) 
Смежные вопросы