2015-07-19 3 views
1

Im пытается вывести разницу между двумя файлами csv двумя столбцами и создать третий файл csv. Как я могу сделать следующий код сравнения по столбцам 0 и 3.Манипулирование файлами csv с Python

import csv 

f1 = open ("ted.csv") 
oldFile1 = csv.reader(f1, delimiter=',') 
oldList1 = list(oldFile1) 

f2 = open ("ted2.csv") 
newFile2 = csv.reader(f2, delimiter=',') 
newList2 = list(newFile2) 

f1.close() 
f2.close() 

output1 = set(tuple(row) for row in newList2 if row not in oldList1) 
output2 = set(tuple(row) for row in oldList1 if row not in newList2) 

with open('Michal_K.csv','w') as csvfile: 
     wr = csv.writer(csvfile,delimiter=',') 
     for line in (output2).difference(output1): 
      wr.writerow(line) 
+1

Это то, о чем писали панды. Взгляните на эту библиотеку! – AZhao

+0

А я вижу спасибо, дайте ему взглянуть. –

ответ

1

Если вы хотите, чтобы строки из ted.csv, которые не имеют каких-либо из тех же третьих и четвертых элементов столбцов как ted2, создать набор эти элементы из ted2 и проверить каждую строку из ted.csv до того письма:

with open("ted.csv") as f1, open("ted2.csv") as f2, open('foo.csv', 'w') as out: 
    r1, r2 = csv.reader(f1), csv.reader(f2) 
    st = set((row[0], row[3]) for row in r1) 
    wr = csv.writer(out) 
    for row in (row for row in r2 if (row[0],row[3]) not in st): 
      wr.writerow(row) 

Если вы действительно хотите что-то вроде symmetric difference, где вы получите уникальные строки из обоих затем сделать набор каждого третьего и четвертого столбцов из обоих файлы:

from itertools import chain 

with open("ted.csv") as f1, open("ted2.csv") as f2, open('foo.csv', 'w') as out: 
    r1, r2 = csv.reader(f1), csv.reader(f2) 
    st1 = set((row[0], row[3]) for row in r1) 
    st2 = set((row[0], row[3]) for row in r2) 
    f1.seek(0), f2.seek(0) 
    wr = csv.writer(out) 
    r1, r2 = csv.reader(f1), csv.reader(f2) 
    output1 = (row for row in r1 if (row[0], row[3]) not in st2) 
    output2 = (row for row in r2 if (row[0], row[3]) not in st1) 
    for row in chain.from_iterable((output1, output2)): 
     wr.writerow(row) 
+0

Спасибо, Im после строк, которые не имеют одного и того же элемента в строке [0] и в строке [3]. По-прежнему попробуем второй подход, чтобы выяснить разницу. –

+0

Второй подход должен дать вам симметричную разницу, основанную на первом и четвертом столбцах. –

+0

Второй подход дает мне индекс списка за пределами диапазона. –

Смежные вопросы