code: def dump(self, out_path, header=True):
          
  
          # See https://stackoverflow.com/a/3348664/9739119 for why this is necessary
          if sys.version_info[0] < 3:
              mode = "wb"
          else:
              mode = "w"
  
          with open(out_path, mode) as outfile:
              writer = csv.writer(outfile, quoting=csv.QUOTE_MINIMAL)
              if header:
                  writer.writerow(["Timestamp", "Tile Address", "Property Name", "Value"])
  
              for entry in self.changes:
                  writer.writerow([entry.time, entry.tile, entry.property, entry.string_value])
docs: Save this list of changes as a csv file at out_path.
  
          The format of the output file will be a CSV with 4 columns:
          timestamp, tile address, property, string_value
  
          There will be a single header row starting the CSV output unless
          header=False is passed.
  
          Args:
              out_path (str): The path where we should save our current list of
                  changes.
              header (bool): Whether we should include a header row in the csv
                  file.  Defaults to True.