2016-08-15 2 views
1

Итак, у меня есть два файла csv. Book1.csv имеет больше данных, чем similarities.csv, поэтому я хочу, чтобы вытащить строки в Book1.csv, что не происходят в similarities.csv Вот что я до сих порСравнение содержимого в двух файлах csv

with open('Book1.csv', 'rb') as csvMasterForDiff: 
     with open('similarities.csv', 'rb') as csvSlaveForDiff: 
      masterReaderDiff = csv.reader(csvMasterForDiff) 
      slaveReaderDiff = csv.reader(csvSlaveForDiff)   

      testNotInCount = 0 
      testInCount = 0 
      for row in masterReaderDiff: 
       if row not in slaveReaderDiff: 
        testNotInCount = testNotInCount + 1 
       else : 
        testInCount = testInCount + 1 


print('Not in file: '+ str(testNotInCount)) 
print('Exists in file: '+ str(testInCount)) 

Однако результаты

Not in file: 2093 
Exists in file: 0 

I знаете, это неверно, потому что, по крайней мере, первые 16 записей в Book1.csv не существуют в similarities.csv не все из них. Что я делаю не так?

ответ

1

csv.reader объект является итератора, что означает, что вы можете перемещаться только через него раз. Вы должны использовать списки/наборы для проверки защитной оболочки, например .:

slave_rows = set(slaveReaderDiff) 

for row in masterReaderDiff: 
    if row not in slave_rows: 
     testNotInCount += 1 
    else: 
     testInCount += 1 
0

После преобразования его в sets, вы можете сделать много set связанных & полезной работы без написания много кода.

slave_rows = set(slaveReaderDiff) 
master_rows = set(masterReaderDiff) 

master_minus_slave_rows = master_rows - slave_rows 
common_rows = master_rows & slave_rows 

print('Not in file: '+ str(len(master_minus_slave_rows))) 
print('Exists in file: '+ str(len(common_rows))) 

Здесь представлены различные set operations, которые вы можете сделать.

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