diff --git a/docs/modules/csv.md b/docs/modules/csv.md index ec930809..47679457 100644 --- a/docs/modules/csv.md +++ b/docs/modules/csv.md @@ -3,10 +3,13 @@ icon: package label: csv --- -### `csv.reader(csvfile: list[str]) -> list` +### `csv.reader(csvfile: list[str]) -> list[list]` Parse a CSV file into a list of lists. +### `csv.DictReader(csvfile: list[str]) -> list[dict]` + +Parse a CSV file into a list of dictionaries. ## Example @@ -22,4 +25,9 @@ print(csv.reader(data.splitlines())) # ['a', 'b', 'c'], # ['1', '2', '3'] # ] + +print(csv.DictReader(data.splitlines())) +# [ +# {'a': '1', 'b': '2', 'c': '3'} +# ] ``` \ No newline at end of file diff --git a/src/csv.cpp b/src/csv.cpp index dc7feaa2..6c53f0bc 100644 --- a/src/csv.cpp +++ b/src/csv.cpp @@ -6,7 +6,7 @@ namespace pkpy{ void add_module_csv(VM *vm){ PyObject* mod = vm->new_module("csv"); - vm->bind(mod, "reader(csvfile: list[str]) -> list", [](VM* vm, ArgsView args){ + vm->bind(mod, "reader(csvfile: list[str]) -> list[list]", [](VM* vm, ArgsView args){ const List& csvfile = CAST(List&, args[0]); List ret; for(int i=0; ibind(mod, "DictReader(csvfile: list[str]) -> list[dict]", [](VM* vm, ArgsView args){ + PyObject* csv_reader = vm->_modules["csv"]->attr("reader"); + PyObject* ret_obj = vm->call(csv_reader, args[0]); + const List& ret = CAST(List&, ret_obj); + if(ret.size() == 0){ + vm->ValueError("empty csvfile"); + } + List header = CAST(List&, ret[0]); + List new_ret; + for(int i=1; iValueError("row.size() != header.size()"); + } + Dict row_dict(vm); + for(int j=0; j