ysh#True

import csv
import os

class CSV:

    def __init__(self, filepath="./", filename="noName.csv"):
        self.file = filepath + filename

    def store(self, data):
        fileIsExist = False
        f = None
        if self._fileIsExist():
            f = open(self.file, mode="a", newline="", encoding="utf-8")
            fileIsExist = True
        else:
            f = open(self.file, mode="w", newline="", encoding="utf-8")

        fieldnames = None
        if fileIsExist:
            fieldnames = self.row(rowIndex=0)

        isRows = False
        if isinstance(data, dict):
            if not fileIsExist:
                fieldnames = list(data.keys())
        elif isinstance(data, list):
            isRows = True
            if not fileIsExist:
                fieldnames = list(data[0].keys())
        else:
            raise Exception("寫入的數據必須傳dict或者列表dict")

        CSVFile = csv.DictWriter(f, fieldnames)

        if not fileIsExist:
            CSVFile.writeheader()

        if isRows:
            CSVFile.writerows(map(lambda i: self._removeKey(fieldnames, i), data))
        else:
            CSVFile.writerow(self._removeKey(fieldnames, data))

    def row(self, rowIndex): # 第一行是0
        '''獲取某行數據的列表'''
        if not self._fileIsExist():
            return []

        row = None
        with open(self.file, mode="r", encoding="utf-8") as f:
            reader = csv.reader(f)
            rows = list(reader)
            row = rows[rowIndex]
        return row

    def _fileIsExist(self) -> bool:
        return os.path.exists(self.file)

    def _removeKey(self, fieldnames: list, data: dict) -> dict:
        for k in list(data.keys()):
            if k not in fieldnames:
                del data[k]
        return data



if __name__ == "__main__":
    c = CSV()
    c.store([{"a":"cccc", "b":"sssssssssss", "c":"333"},{"a":"cccc", "b":"sssssssssss", "c":"333"},{"a":"cccc", "b":"sssssssssss", "c":"333"}])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章