79 lines
1.9 KiB
Python
79 lines
1.9 KiB
Python
import csv
|
|
|
|
from loaders.basemanager import BaseDataManager
|
|
from loaders.formats import DataFormat
|
|
|
|
|
|
class CSVManager(BaseDataManager):
|
|
"""
|
|
Utility class to keep CSV data for export in other formats.
|
|
|
|
Attributes:
|
|
data: Contains loaded file data as a list of lists.
|
|
|
|
"""
|
|
|
|
data: list = None
|
|
|
|
def __init__(self, url: str):
|
|
"""
|
|
Initialize the object with a URL.
|
|
|
|
Args:
|
|
url: CSV URL to load from.
|
|
|
|
"""
|
|
self.load(url)
|
|
|
|
def load(self, url: str, encoding: str = "iso8859-1"):
|
|
"""
|
|
Load a CSV given its file path.
|
|
|
|
Args:
|
|
url: Path of the CSV file.
|
|
encoding: Codepage name of the text file.
|
|
|
|
"""
|
|
with open(url, "r", encoding=encoding) as f:
|
|
reader = csv.reader(f, delimiter=",")
|
|
if self.data is None:
|
|
self.data = []
|
|
for row in reader:
|
|
self.data.append(row)
|
|
|
|
def export(self, url: str, fmt: DataFormat):
|
|
"""Official method to export data."""
|
|
if fmt is DataFormat.TEXT:
|
|
self.export_text(url)
|
|
elif fmt is DataFormat.CSV:
|
|
self.export_csv(url)
|
|
else:
|
|
raise ValueError(f"{fmt}: unsupported format.")
|
|
|
|
def export_text(self, url: str):
|
|
"""
|
|
Save data as a text file.
|
|
|
|
Every column is save in its own line as an example.
|
|
|
|
Args:
|
|
url: Output file path.
|
|
|
|
"""
|
|
with open(url, "w", encoding="utf-8") as file:
|
|
for row in self.data:
|
|
file.write("\n".join(row))
|
|
|
|
def export_csv(self, url: str):
|
|
"""
|
|
Save data as a CSV file with semicolons.
|
|
|
|
Args:
|
|
url: Output file path.
|
|
|
|
"""
|
|
with open(url, "w", encoding="utf-8") as file:
|
|
writer = csv.writer(file, delimiter=";")
|
|
for row in self.data:
|
|
writer.writerow(row)
|