Source code for pyEpiabm.output._csv_dict_writer
#
# Write data in a dict to a csv file
#
import csv
import typing
import os
import pandas as pd
import logging
from pyEpiabm.output.abstract_reporter import AbstractReporter
[docs]
class _CsvDictWriter(AbstractReporter):
[docs]
def __init__(self, folder: str, filename: str, fieldnames: typing.List,
clear_folder: bool = False):
"""Initialises a file to store output in, and which categories
to record.
Parameters
----------
folder : str
Output folder path
filename : str
Output file name
fieldnames : typing.List
List of categories to be saved
clear_folder : bool
Whether to empty the folder before saving results
"""
super().__init__(folder, clear_folder)
self.filename = filename
self.filepath = os.path.join(folder, filename)
self.filepath_without_extension = os.path.join(
folder, os.path.splitext(filename)[0])
self.fieldnames = fieldnames
self.f = open(os.path.join(folder, filename), 'w', newline='')
self.writer = csv.DictWriter(
self.f, fieldnames=fieldnames, delimiter=',')
self.writer.writeheader()
[docs]
def __del__(self):
"""Closes the file when the simulation is finished.
Required for file data to be further used.
"""
if self.f:
self.f.close()
[docs]
def write(self, row: typing.Dict):
"""Writes data to file.
Parameters
----------
row : dict
Dictionary of data to be saved
"""
self.writer.writerow(row)
self.f.flush()
[docs]
def compress(self):
"""Compresses the csv file and deletes the unzipped csv.
"""
output_filepath = f"{self.filepath_without_extension}.zip"
logging.info(f"Zip file created for {self.filename}")
df = pd.read_csv(self.filepath)
df.to_csv(output_filepath, index=False, compression={'method': 'zip'})
self.f.close()
os.remove(self.filepath)