A simple way of working with csv files.
You can use:
data = csvfile.load("my-data.csv")
data[0].field = "new value"
data.sync()
Instead of:
data = []
with open("my-data.csv") as f:
reader = csv.DictReader(f)
fieldnames = reader.fieldnames
for row in reader:
data.append(row)
data[0]["field"] = "new value"
with open("my-data.csv, "w") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(data)
Also you can declaratively define types in a table's header:
>>> print(open("/tmp/csvfile_test.csv").read())
language,created:i
python,1991
js,1995
rust,2010
>>> pprint(csvfile.load("/tmp/csvfile_test.csv"))
[{'created': 1991, 'language': 'python'},
{'created': 1995, 'language': 'js'},
{'created': 2010, 'language': 'rust'}]
Notice, that created
is automatically converted into integer as we typed it in
the header as created:i
.
Type | Alias | Comment |
---|---|---|
str | s | default, if no type specified |
bool | b | reader can understand next pairs as True / False case-insensitevely: true / false , t / f , 1 / 0 , y / n , yes / no , on / off , but the writer will always stringify them into true / false |
int | i | |
float | f | |
decimal | n | |
date | d | ISO 8601, YYYY-MM-DD |
datetime | t | ISO 8601, YYYY-MM-DDTHH:MM:SS.ffffff |
json | j |
Empty cells will become None
for any type except of str
.
As in case of str
there's no way to distinguish it from an empty string.
The api consists in a single function load
with the signature:
table = load(
filename: Union[Path, str], # the file should exist and contain headers
*csvargs: Any, # `*args` for the standard `csv.reader`
limit: Optional[int] = None, # maximum number of rows to read
**csvkwargs: Any, # `**fmtparams` for the standard `csv.reader`
)
The returned object has a list
interface with an additional sync
method to
save changes back into the file.
pip install -r requirements-dev.txt
pytest