Package: aiocsv
aiocsvAsynchronous CSV reading and writing.Installationpip install aiocsv. Python 3.8+ is required.This module contains an extension written in C. Pre-build binaries
may not be available for your configuration. You might need a C compiler
and Python headers to install aiocsv.UsageAsyncReader & AsyncDictReader accept any object that has aread(size: int)coroutine,
which should return a string.AsyncWriter & AsyncDictWriter accept any object that has awrite(b: str)coroutine.Reading is implemented using a custom CSV parser, which should behave exactly like the CPython parser.Writing is implemented using the synchronous csv.writer and csv.DictWriter objects -
the serializers write data to a StringIO, and that buffer is then rewritten to the underlying
asynchronous file.ExampleExample usage withaiofiles.importasyncioimportcsvimportaiofilesfromaiocsvimportAsyncReader,AsyncDictReader,AsyncWriter,AsyncDictWriterasyncdefmain():# simple readingasyncwithaiofiles.open("some_file.csv",mode="r",encoding="utf-8",newline="")asafp:asyncforrowinAsyncReader(afp):print(row)# row is a list# dict reading, tab-separatedasyncwithaiofiles.open("some_other_file.tsv",mode="r",encoding="utf-8",newline="")asafp:asyncforrowinAsyncDictReader(afp,delimiter="\t"):print(row)# row is a dict# simple writing, "unix"-dialectasyncwithaiofiles.open("new_file.csv",mode="w",encoding="utf-8",newline="")asafp:writer=AsyncWriter(afp,dialect="unix")awaitwriter.writerow(["name","age"])awaitwriter.writerows([["John",26],["Sasha",42],["Hana",37]])# dict writing, all quoted, "NULL" for missing fieldsasyncwithaiofiles.open("new_file2.csv",mode="w",encoding="utf-8",newline="")asafp:writer=AsyncDictWriter(afp,["name","age"],restval="NULL",quoting=csv.QUOTE_ALL)awaitwriter.writeheader()awaitwriter.writerow({"name":"John","age":26})awaitwriter.writerows([{"name":"Sasha","age":42},{"name":"Hana"}])asyncio.run(main())Differences withcsvaiocsvstrives to be a drop-in replacement for Python's builtincsv module. However, there are 3 notable differences:Readers accept objects with asyncreadmethods, instead of an AsyncIterable over lines
from a file.AsyncDictReader.fieldnamescan beNone- useawait AsyncDictReader.get_fieldnames()instead.Changes tocsv.field_size_limitare not picked up by existing Reader instances.
The field size limit is cached on Reader instantiation to avoid expensive function calls
on each character of the input.Referenceaiocsv.AsyncReaderAsyncReader(asyncfile: aiocsv.protocols.WithAsyncRead, **csvreaderparams)An object that iterates over records in the given asynchronous CSV file.
Additional keyword arguments are understood as dialect parameters.Iterating over this object returns parsed CSV rows (List[str]).Methods:__aiter__(self) -> selfasync __anext__(self) -> List[str]Read-only properties:dialect: The csv.Dialect used when parsingline_num: The number of lines read from the source file. This coincides with a 1-based index
of the line number of the last line of the recently parsed record.aiocsv.AsyncDictReaderAsyncDictReader(
    asyncfile: aiocsv.protocols.WithAsyncRead,
    fieldnames: Optional[Sequence[str]] = None,
    restkey: Optional[str] = None,
    restval: Optional[str] = None,
    **csvreaderparams,
)An object that iterates over records in the given asynchronous CSV file.
All arguments work exactly the same was as in csv.DictReader.Iterating over this object returns parsed CSV rows (Dict[str, str]).Methods:__aiter__(self) -> selfasync __anext__(self) -> Dict[str, str]async get_fieldnames(self) -> List[str]Properties:fieldnames: field names used when converting rows to dictionaries⚠️Unlike csv.DictReader, this property can't read the fieldnames if they are missing -
it's not possible toawaiton the header row in a property getter.Useawait reader.get_fieldnames().reader=csv.DictReader(some_file)reader.fieldnames# ["cells", "from", "the", "header"]areader=aiofiles.AsyncDictReader(same_file_but_async)areader.fieldnames# ⚠️ Noneawaitareader.get_fieldnames()# ["cells", "from", "the", "header"]restkey: If a row has more cells then the header, all remaining cells are stored under
this key in the returned dictionary. Defaults toNone.restval: If a row has less cells then the header, then missing keys will use this
value. Defaults toNone.reader: Underlyingaiofiles.AsyncReaderinstanceRead-only properties:dialect: Link toself.reader.dialect- the current csv.Dialectline_num: The number of lines read from the source file. This coincides with a 1-based index
of the line number of the last line of the recently parsed record.aiocsv.AsyncWriterAsyncWriter(asyncfile: aiocsv.protocols.WithAsyncWrite, **csvwriterparams)An object that writes csv rows to the given asynchronous file.
In this object "row" is a sequence of values.Additional keyword arguments are passed to the underlying csv.writer instance.Methods:async writerow(self, row: Iterable[Any]) -> None:
Writes one row to the specified file.async writerows(self, rows: Iterable[Iterable[Any]]) -> None:
Writes multiple rows to the specified file.Readonly properties:dialect: Link to underlying's csv.reader'sdialectattributeaiocsv.AsyncDictWriterAsyncDictWriter(asyncfile: aiocsv.protocols.WithAsyncWrite, fieldnames: Sequence[str], **csvdictwriterparams)An object that writes csv rows to the given asynchronous file.
In this object "row" is a mapping from fieldnames to values.Additional keyword arguments are passed to the underlying csv.DictWriter instance.Methods:async writeheader(self) -> None: Writes header row to the specified file.async writerow(self, row: Mapping[str, Any]) -> None:
Writes one row to the specified file.async writerows(self, rows: Iterable[Mapping[str, Any]]) -> None:
Writes multiple rows to the specified file.Readonly properties:dialect: Link to underlying's csv.reader'sdialectattributeaiocsv.protocols.WithAsyncReadAtyping.Protocoldescribing an asynchronous file, which can be read.aiocsv.protocols.WithAsyncWriteAtyping.Protocoldescribing an asynchronous file, which can be written to.