Skip to main content

Asynchronous CSV reading/writing

Project description

aiocsv

Asynchronous CSV reading and writing.

Installation

Python 3.8+ is required.
pip3 install aiocsv

Usage

Always open files in text mode and with newline="", otherwise bad things happen.

AsyncReader & AsyncDictReader accept any object that has a read(size: int) coroutine, which should return a string.

AsyncWriter & AsyncDictWriter accept any object that has a write(b: str) coroutine.

All objects in aiocsv pass keyword arguments to the underlying csv.reader/csv.writer/... instances.

Example

Example usage with aiofiles.

import asyncio
import csv

import aiofiles
from aiocsv import AsyncReader, AsyncDictReader, AsyncWriter, AsyncDictWriter

async def main():
    # simple reading
    async with aiofiles.open("some_file.csv", mode="r", encoding="utf-8", newline="") as afp:
        async for row in AsyncReader(afp):
            print(row)  # row is a list

    # dict reading, tab-separated
    async with aiofiles.open("some_other_file.tsv", mode="r", encoding="utf-8", newline="") as afp:
        async for row in AsyncDictReader(afp, delimiter="\t"):
            print(row)  # row is a dict

    # simple writing, "unix"-dialect
    async with aiofiles.open("new_file.csv", mode="r", encoding="utf-8", newline="") as afp:
        writer = AsyncWriter(afp, dialect="unix")
        await writer.writerow(["name", "age"])
        await writer.writerows([
            ["John", 26], ["Sasha", 42], ["Hana", 37]
        ])

    # dict writing, all quoted, "NULL" for missing fields
    async with aiofiles.open("new_file2.csv", mode="r", encoding="utf-8", newline="") as afp:
        writer = AsyncDictWriter(afp, ["name", "age"], restval="NULL", quoting=csv.QUOTE_ALL)
        await writer.writeheader()
        await writer.writerow({"name": "John", "age": 26})
        await writer.writerows([
            {"name": "Sasha", "age": 42},
            {"name": "Hana"}
        ])

asyncio.run(main())

Caching

AsyncReader / AsyncDictReader will read a set amount of bytes from the provided stream, cache it in a io.StringIO. This StringIO is then consumed by the underlying csv.reader / csv.DictReader instances.

By default 1024 bytees are read from the stream, you can change this value by setting aiocsv.READ_SIZE.

AsyncWriter / AsyncDictWriter will follow provided row(s) to their underlying csv.writer / csv.DictWriter instances. They output produced CSV rows into a io.StringIO, which is then rewritten to the actual stream.

Reference

aiocsv.AsyncReader

AsyncReader(asyncfile: aiocsv._WithAsyncRead, **csvreaderparams)

An object that iterates over lines in given asynchronous file.
Additional keyword arguments are passed to the underlying csv.reader instance.

Iterating over this object returns parsed CSV rows (List[str]).

Methods:

  • __aiter__(self) -> self
  • async __anext__(self) -> List[str]
  • __init__(self, asyncfile: aiocsv._WithAsyncRead, **csvreaderparams) -> None

Readonly properties:

  • dialect: Link to underlying's csv.reader's dialect attribute
  • line_num: Link to underlying's csv.reader's line_num attribute

aiocsv.AsyncDictReader

AsyncDictReader(asyncfile: aiocsv._WithAsyncRead, **csvdictreaderparams)

An object that iterates over lines in given asynchronous file.
Additional keyword arguments are passed to the underlying csv.DictReader instance.

If given csv file has no header, provide a 'fieldnames' keyword argument,
like you would to csv.DictReader.

Iterating over this object returns parsed CSV rows (Dict[str, str]).

Methods:

  • __aiter__(self) -> self
  • async __anext__(self) -> Dict[str, str]
  • __init__(self, asyncfile: aiocsv._WithAsyncRead, **csvdictreaderparams) -> None

Readonly properties:

  • dialect: Link to underlying's csv.reader's dialect attribute
  • line_num: Link to underlying's csv.reader's line_num attribute

aiocsv.AsyncWriter

AsyncWriter(asyncfile: aiocsv._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:

  • __init__(self, asyncfile: aiocsv._WithAsyncWrite, **csvwriterparams) -> None

  • 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.

    All rows are temporarly stored in RAM before actually being written to the file,
    so don't provide a generator of loads of rows.

Readonly properties:

  • dialect: Link to underlying's csv.reader's dialect attribute

aiocsv.AsyncDictWriter

AsyncDictWriter(asyncfile: aiocsv._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:

  • __init__(self, asyncfile: aiocsv._WithAsyncWrite, fieldnames: Sequence[str], **csvdictwriterparams) -> None

  • 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.

    All rows are temporarly stored in RAM before actually being written to the file, so don't provide a generator of loads of rows.

Readonly properties:

  • dialect: Link to underlying's csv.reader's dialect attribute

aiocsv.READ_SIZE

(int); Amout of bytes to be read when consuming streams in Reader instances.

aiocsv._WithAsyncRead

A typing.Protocol describing an asynchronous file, which can be read.

aiocsv._WithAsyncWrite

A typing.Protocol describing an asynchronous file, which can be written to.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aiocsv-1.1.0.tar.gz (5.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aiocsv-1.1.0-py3-none-any.whl (7.7 kB view details)

Uploaded Python 3

File details

Details for the file aiocsv-1.1.0.tar.gz.

File metadata

  • Download URL: aiocsv-1.1.0.tar.gz
  • Upload date:
  • Size: 5.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.24.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.46.0 CPython/3.8.2

File hashes

Hashes for aiocsv-1.1.0.tar.gz
Algorithm Hash digest
SHA256 70b16fe552d6ff98c96b905ba202541a12ee89d38dd72bb4725b7d98b4bd5242
MD5 092df285e56ae68b2e3bf4e8c634642e
BLAKE2b-256 4bd97c8583c56f5f6066af8637d4183427f34b6bfffad6714dbd94656fdf28ab

See more details on using hashes here.

File details

Details for the file aiocsv-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: aiocsv-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 7.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.24.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.46.0 CPython/3.8.2

File hashes

Hashes for aiocsv-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 99151dc40f60fb00977ff017f62c96cf58cb82d3ad7eec4f1df4555c58fcf68e
MD5 17b2c7cedb7a16b1a80c6eecc0dcfcda
BLAKE2b-256 bd0f88714cbd5ba2b576fb378d343238ca7ea4f629210508176ed95aa87194b4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page