Compare 2 seperate csv files and write difference to a new csv file - Python 2.7
Question: I am trying to compare two csv files in python and save the difference to a
third csv file in python 2.7.

    
    
    import csv
    
    f1 = open ("olddata/file1.csv")
    oldFile1 = csv.reader(f1)
    oldList1 = []
    for row in oldFile1:
        oldList1.append(row)
    
    f2 = open ("newdata/file2.csv")
    oldFile2 = csv.reader(f2)
    oldList2 = []
    for row in oldFile2:
        oldList2.append(row)
    
    f1.close()
    f2.close()
    
    set1 = tuple(oldList1)
    set2 = tuple(oldList2)
    
    print oldList2.difference(oldList1)
    

I get the error message:

    
    
    Traceback (most recent call last):
      File "compare.py", line 21, in <module>
        print oldList2.difference(oldList1)
    AttributeError: 'list' object has no attribute 'difference'
    

I am new to python, and coding in general, and I am not done with this code
just yet (I have to make sure to store the differences to a variable and write
the difference to a new csv file.). I have been trying to solve this all day
and I simply can't. Your help would be greatly appreciated.


Answer: What do you mean by difference? The answer to that gives you two distinct
possibilities.

If a row is considered same when **all columns** are same, then you can get
your answer via the following code:

    
    
    import csv
    
    f1 = open ("olddata/file1.csv")
    oldFile1 = csv.reader(f1)
    oldList1 = []
    for row in oldFile1:
        oldList1.append(row)
    
    f2 = open ("newdata/file2.csv")
    oldFile2 = csv.reader(f2)
    oldList2 = []
    for row in oldFile2:
        oldList2.append(row)
    
    f1.close()
    f2.close()
    
    print [row for row in oldList1 if row not in oldList2]
    

However, if two rows are same if a **certain key field (i.e. column)** is
same, then the following code will give you your answer:

    
    
    import csv
    
    f1 = open ("olddata/file1.csv")
    oldFile1 = csv.reader(f1)
    oldList1 = []
    for row in oldFile1:
        oldList1.append(row)
    
    f2 = open ("newdata/file2.csv")
    oldFile2 = csv.reader(f2)
    oldList2 = []
    for row in oldFile2:
        oldList2.append(row)
    
    f1.close()
    f2.close()
    
    keyfield = 0 # Change this for choosing the column number
    
    oldList2keys = [row[keyfield] for row in oldList2]
    print [row for row in oldList1 if row[keyfield] not in oldList2keys]
    

**Note:** The above code might run slow for extremely large files. If instead,
you wish to speed up code through hashing, you can use `set` after converting
the `oldList`s using the following code:

    
    
    set1 = set(tuple(row) for row in oldList1)
    set2 = set(tuple(row) for row in oldList2)
    

After this, you can use `set1.difference(set2)`

