CMU 15-112: Fundamentals of Programming and Computer Science
Class Notes: Serialization


  1. Reading and Writing CSV Files
    import csv
    
    def readCsv(path):
        with open(path, 'rt') as f:
            # returns data as a table (2d list)
            return list(csv.reader(f))
    
    def writeCsv(path, data):
        # data is a table (2d list)
        with open(path, 'wt', newline='') as f:
            csv.writer(f).writerows(data)
    
    data = [
            [ 'name',  'age',  'favorite-color' ],
            [ 'ann',   '32',     'green'           ],
            [ 'ben',   '25',     'blue'            ],
            [ 'cam',   '43',     'purple'          ]
           ]
    
    path = 'myData.csv'
    writeCsv(path, data) # careful, this overwrites the file if it exists!
    
    print(f'Open the first {path} and verify that it looks right.')
    input('Press enter to continue --> ') 
    
    dataRead = readCsv(path)
    assert(data == dataRead)
    print('Data read matches original data!')

  2. Issue: CSV Files do not preserve types
    import csv
    
    def readCsv(path):
        with open(path, 'rt') as f:
            # returns data as a table (2d list)
            return list(csv.reader(f))
    
    def writeCsv(path, data):
        # data is a table (2d list)
        with open(path, 'wt', newline='') as f:
            csv.writer(f).writerows(data)
    
    data = [
            [ 'name',  'age',  'favorite-color' ],
            [ 'ann',   32,     'green'           ],
            [ 'ben',   25,     'blue'            ],
            [ 'cam',   43,     'purple'          ]
           ]
    
    path = 'myData.csv'
    writeCsv(path, data) # careful, this overwrites the file if it exists!
    
    print(f'Open the first {path} and verify that it looks right.')
    input('Press enter to continue --> ') 
    
    dataRead = readCsv(path)
    assert(data != dataRead)
    print('Data read DOES NOT MATCH original data!')

  3. Alternative: JSON files
    # This works with dicts, lists, strings, ints, floats, and booleans.
    
    import json
    
    def readJson(path):
        with open(path, 'rt') as f:
            return json.loads(f.read())
    
    def writeJson(path, data):
        with open(path, 'wt') as f:
            f.write(json.dumps(data))
    
    data = [
            [ 'name',  'age',  'favorite-color' ],
            [ 'ann',   32,     'green'           ],
            [ 'ben',   25,     'blue'            ],
            [ 'cam',   43,     'purple'          ]
           ]
    
    path = 'myData.json'
    writeJson(path, data) # careful, this overwrites the file if it exists!
    
    print(f'Open the first {path} and verify that it looks right.')
    input('Press enter to continue --> ') 
    
    dataRead = readJson(path)
    assert(data == dataRead)
    print('Data read DOES MATCH original data!  Woohoo!')