aiocsv


Nameaiocsv JSON
Version 1.3.2 PyPI version JSON
download
home_pageNone
SummaryNone
upload_time2024-04-28 10:30:30
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords async asynchronous csv tsv
VCS
bugtrack_url
requirements typing_extensions
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # aiocsv

Asynchronous CSV reading and writing.


## Installation

`pip 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.


## Usage

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.

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.


## Example

Example usage with [aiofiles](https://pypi.org/project/aiofiles/).

```python
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="w", 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="w", 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())
```

## Differences with `csv`

`aiocsv` strives to be a drop-in replacement for Python's builtin
[csv module](https://docs.python.org/3/library/csv.html). However, there are 3 notable differences:

- Readers accept objects with async `read` methods, instead of an AsyncIterable over lines
    from a file.
- `AsyncDictReader.fieldnames` can be `None` - use `await AsyncDictReader.get_fieldnames()` instead.
- Changes to `csv.field_size_limit` are 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.

Other, minor, differences include:
- `AsyncReader.line_num`, `AsyncDictReader.line_num` and `AsyncDictReader.dialect` are not settable,
- `AsyncDictReader.reader` is of `AsyncReader` type,
- `AsyncDictWriter.writer` is of `AsyncWriter` type,
- `AsyncDictWriter` provides an extra, read-only `dialect` property.


## Reference


### aiocsv.AsyncReader

```
AsyncReader(
    asyncfile: aiocsv.protocols.WithAsyncRead,
    dialect: str | csv.Dialect | Type[csv.Dialect] = "excel",
    **csv_dialect_kwargs: Unpack[aiocsv.protocols.CsvDialectKwargs],
)
```

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) -> self`
- `async __anext__(self) -> List[str]`

*Read-only properties*:
- `dialect`: The csv.Dialect used when parsing
- `line_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.AsyncDictReader

```
AsyncDictReader(
    asyncfile: aiocsv.protocols.WithAsyncRead,
    fieldnames: Optional[Sequence[str]] = None,
    restkey: Optional[str] = None,
    restval: Optional[str] = None,
    dialect: str | csv.Dialect | Type[csv.Dialect] = "excel",
    **csv_dialect_kwargs: Unpack[aiocsv.protocols.CsvDialectKwargs],
)
```

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) -> self`
- `async __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 to `await` on the header row in a property getter.
    **Use `await reader.get_fieldnames()`**.
    ```py
    reader = csv.DictReader(some_file)
    reader.fieldnames  # ["cells", "from", "the", "header"]

    areader = aiofiles.AsyncDictReader(same_file_but_async)
    areader.fieldnames   # ⚠️ None
    await areader.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 to `None`.
- `restval`: If a row has less cells then the header, then missing keys will use this
    value. Defaults to `None`.
- `reader`: Underlying `aiofiles.AsyncReader` instance

*Read-only properties*:
- `dialect`: Link to `self.reader.dialect` - the current csv.Dialect
- `line_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.AsyncWriter

```
AsyncWriter(
    asyncfile: aiocsv.protocols.WithAsyncWrite,
    dialect: str | csv.Dialect | Type[csv.Dialect] = "excel",
    **csv_dialect_kwargs: Unpack[aiocsv.protocols.CsvDialectKwargs],
)
```

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.writer's `dialect` attribute


### aiocsv.AsyncDictWriter

```
AsyncDictWriter(
    asyncfile: aiocsv.protocols.WithAsyncWrite,
    fieldnames: Sequence[str],
    restval: Any = "",
    extrasaction: Literal["raise", "ignore"] = "raise",
    dialect: str | csv.Dialect | Type[csv.Dialect] = "excel",
    **csv_dialect_kwargs: Unpack[aiocsv.protocols.CsvDialectKwargs],
)
```

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.

*Properties*:
- `fieldnames`: Sequence of keys to identify the order of values when writing rows
    to the underlying file
- `restval`: Placeholder value used when a key from fieldnames is missing in a row,
    defaults to `""`
- `extrasaction`: Action to take when there are keys in a row, which are not present in
    fieldnames, defaults to `"raise"` which causes ValueError to be raised on extra keys,
    may be also set to `"ignore"` to ignore any extra keys
- `writer`: Link to the underlying `AsyncWriter`

*Readonly properties*:
- `dialect`: Link to underlying's csv.reader's `dialect` attribute


### aiocsv.protocols.WithAsyncRead
A `typing.Protocol` describing an asynchronous file, which can be read.


### aiocsv.protocols.WithAsyncWrite
A `typing.Protocol` describing an asynchronous file, which can be written to.


### aiocsv.protocols.CsvDialectArg
Type of the `dialect` argument, as used in the `csv` module.


### aiocsv.protocols.CsvDialectKwargs
Keyword arguments used by `csv` module to override the dialect settings during reader/writer
instantiation.

## Development

Contributions are welcome, however please open an issue beforehand. `aiocsv` is meant as
a replacement for the built-in `csv`, any features not present in the latter will be rejected.

### Building from source

To create a wheel (and a source tarball), run `python -m build`.

For local development, use a [virtual environment](https://docs.python.org/3/library/venv.html).
`pip install --editable .` will build the C extension and make it available for the current
venv. This is required for running the tests. However, [due to the mess of Python packaging](https://docs.python.org/3/library/venv.html)
this will force an optimized build without debugging symbols. If you need to debug the C part
of aiocsv and build the library with e.g. debugging symbols, the only sane way is to
run `python setup.py build --debug` and manually copy the shared object/DLL from `build/lib*/aiocsv`
to `aiocsv`.

### Tests

This project uses [pytest](https://docs.pytest.org/en/latest/contents.html) with
[pytest-asyncio](https://pypi.org/project/pytest-asyncio/) for testing. Run `pytest`
after installing the library in the manner explained above.

### Linting & other tools

This library uses [black](https://pypi.org/project/black/) and [isort](https://pypi.org/project/isort/)
for formatting and [pyright](https://github.com/microsoft/pyright) in strict mode for type checking.

For the C part of library, please use [clang-format](https://clang.llvm.org/docs/ClangFormat.html)
for formatting and [clang-tidy](https://clang.llvm.org/extra/clang-tidy/) linting,
however this are not yet integrated in the CI.

### Installing required tools

`pip install -r requirements.dev.txt` will pull all of the development tools mentioned above,
however this might not be necessary depending on your setup. For example, if you use VS Code
with the Python extension, pyright is already bundled and doesn't need to be installed again. 

### Recommended VS Code settings

Use [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python),
[Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)
(should be installed automatically alongside Python extension),
[black](https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter) and
[isort](https://marketplace.visualstudio.com/items?itemName=ms-python.isort) Python extensions.

You will need to install all dev dependencies from `requirements.dev.txt`, except for `pyright`.
Recommended `.vscode/settings.json`:

```json
{
    "C_Cpp.codeAnalysis.clangTidy.enabled": true,
    "python.testing.pytestArgs": [
        "."
    ],
    "python.testing.unittestEnabled": false,
    "python.testing.pytestEnabled": true,
    "[python]": {
        "editor.formatOnSave": true,
        "editor.codeActionsOnSave": {
            "source.organizeImports": "always"
        }
    },
    "[c]": {
        "editor.formatOnSave": true
    }
}
```

For the C part of the library, [C/C++ extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) is sufficient.
Ensure that your system has Python headers installed. Usually a separate package like python3-dev
needs to be installed, consult with your system repositories on that. `.vscode/c_cpp_properties.json`
needs to manually include Python headers under `includePath`. On my particular system this
config file looks like this:

```json
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/include/python3.11"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/clang",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "linux-clang-x64"
        }
    ],
    "version": 4
}
```

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "aiocsv",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "async, asynchronous, csv, tsv",
    "author": null,
    "author_email": "Miko\u0142aj Kuranowski <mkuranowski+pypackages@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/33/78/bd4a85d195e57e72837415ef81d26ce6db6fdf185dce8d4f6a7c099ed4af/aiocsv-1.3.2.tar.gz",
    "platform": null,
    "description": "# aiocsv\n\nAsynchronous CSV reading and writing.\n\n\n## Installation\n\n`pip install aiocsv`. Python 3.8+ is required.\n\nThis module contains an extension written in C. Pre-build binaries\nmay not be available for your configuration. You might need a C compiler\nand Python headers to install aiocsv.\n\n\n## Usage\n\nAsyncReader & AsyncDictReader accept any object that has a `read(size: int)` coroutine,\nwhich should return a string.\n\nAsyncWriter & AsyncDictWriter accept any object that has a `write(b: str)` coroutine.\n\nReading is implemented using a custom CSV parser, which should behave exactly like the CPython parser.\n\nWriting is implemented using the synchronous csv.writer and csv.DictWriter objects -\nthe serializers write data to a StringIO, and that buffer is then rewritten to the underlying\nasynchronous file.\n\n\n## Example\n\nExample usage with [aiofiles](https://pypi.org/project/aiofiles/).\n\n```python\nimport asyncio\nimport csv\n\nimport aiofiles\nfrom aiocsv import AsyncReader, AsyncDictReader, AsyncWriter, AsyncDictWriter\n\nasync def main():\n    # simple reading\n    async with aiofiles.open(\"some_file.csv\", mode=\"r\", encoding=\"utf-8\", newline=\"\") as afp:\n        async for row in AsyncReader(afp):\n            print(row)  # row is a list\n\n    # dict reading, tab-separated\n    async with aiofiles.open(\"some_other_file.tsv\", mode=\"r\", encoding=\"utf-8\", newline=\"\") as afp:\n        async for row in AsyncDictReader(afp, delimiter=\"\\t\"):\n            print(row)  # row is a dict\n\n    # simple writing, \"unix\"-dialect\n    async with aiofiles.open(\"new_file.csv\", mode=\"w\", encoding=\"utf-8\", newline=\"\") as afp:\n        writer = AsyncWriter(afp, dialect=\"unix\")\n        await writer.writerow([\"name\", \"age\"])\n        await writer.writerows([\n            [\"John\", 26], [\"Sasha\", 42], [\"Hana\", 37]\n        ])\n\n    # dict writing, all quoted, \"NULL\" for missing fields\n    async with aiofiles.open(\"new_file2.csv\", mode=\"w\", encoding=\"utf-8\", newline=\"\") as afp:\n        writer = AsyncDictWriter(afp, [\"name\", \"age\"], restval=\"NULL\", quoting=csv.QUOTE_ALL)\n        await writer.writeheader()\n        await writer.writerow({\"name\": \"John\", \"age\": 26})\n        await writer.writerows([\n            {\"name\": \"Sasha\", \"age\": 42},\n            {\"name\": \"Hana\"}\n        ])\n\nasyncio.run(main())\n```\n\n## Differences with `csv`\n\n`aiocsv` strives to be a drop-in replacement for Python's builtin\n[csv module](https://docs.python.org/3/library/csv.html). However, there are 3 notable differences:\n\n- Readers accept objects with async `read` methods, instead of an AsyncIterable over lines\n    from a file.\n- `AsyncDictReader.fieldnames` can be `None` - use `await AsyncDictReader.get_fieldnames()` instead.\n- Changes to `csv.field_size_limit` are not picked up by existing Reader instances.\n    The field size limit is cached on Reader instantiation to avoid expensive function calls\n    on each character of the input.\n\nOther, minor, differences include:\n- `AsyncReader.line_num`, `AsyncDictReader.line_num` and `AsyncDictReader.dialect` are not settable,\n- `AsyncDictReader.reader` is of `AsyncReader` type,\n- `AsyncDictWriter.writer` is of `AsyncWriter` type,\n- `AsyncDictWriter` provides an extra, read-only `dialect` property.\n\n\n## Reference\n\n\n### aiocsv.AsyncReader\n\n```\nAsyncReader(\n    asyncfile: aiocsv.protocols.WithAsyncRead,\n    dialect: str | csv.Dialect | Type[csv.Dialect] = \"excel\",\n    **csv_dialect_kwargs: Unpack[aiocsv.protocols.CsvDialectKwargs],\n)\n```\n\nAn object that iterates over records in the given asynchronous CSV file.\nAdditional keyword arguments are understood as dialect parameters.\n\nIterating over this object returns parsed CSV rows (`List[str]`).\n\n*Methods*:\n- `__aiter__(self) -> self`\n- `async __anext__(self) -> List[str]`\n\n*Read-only properties*:\n- `dialect`: The csv.Dialect used when parsing\n- `line_num`: The number of lines read from the source file. This coincides with a 1-based index\n    of the line number of the last line of the recently parsed record.\n\n\n### aiocsv.AsyncDictReader\n\n```\nAsyncDictReader(\n    asyncfile: aiocsv.protocols.WithAsyncRead,\n    fieldnames: Optional[Sequence[str]] = None,\n    restkey: Optional[str] = None,\n    restval: Optional[str] = None,\n    dialect: str | csv.Dialect | Type[csv.Dialect] = \"excel\",\n    **csv_dialect_kwargs: Unpack[aiocsv.protocols.CsvDialectKwargs],\n)\n```\n\nAn object that iterates over records in the given asynchronous CSV file.\nAll arguments work exactly the same was as in csv.DictReader.\n\nIterating over this object returns parsed CSV rows (`Dict[str, str]`).\n\n*Methods*:\n- `__aiter__(self) -> self`\n- `async __anext__(self) -> Dict[str, str]`\n- `async get_fieldnames(self) -> List[str]`\n\n\n*Properties*:\n- `fieldnames`: field names used when converting rows to dictionaries  \n    **\u26a0\ufe0f** Unlike csv.DictReader, this property can't read the fieldnames if they are missing -\n    it's not possible to `await` on the header row in a property getter.\n    **Use `await reader.get_fieldnames()`**.\n    ```py\n    reader = csv.DictReader(some_file)\n    reader.fieldnames  # [\"cells\", \"from\", \"the\", \"header\"]\n\n    areader = aiofiles.AsyncDictReader(same_file_but_async)\n    areader.fieldnames   # \u26a0\ufe0f None\n    await areader.get_fieldnames()  # [\"cells\", \"from\", \"the\", \"header\"]\n    ```\n- `restkey`: If a row has more cells then the header, all remaining cells are stored under\n    this key in the returned dictionary. Defaults to `None`.\n- `restval`: If a row has less cells then the header, then missing keys will use this\n    value. Defaults to `None`.\n- `reader`: Underlying `aiofiles.AsyncReader` instance\n\n*Read-only properties*:\n- `dialect`: Link to `self.reader.dialect` - the current csv.Dialect\n- `line_num`: The number of lines read from the source file. This coincides with a 1-based index\n    of the line number of the last line of the recently parsed record.\n\n\n### aiocsv.AsyncWriter\n\n```\nAsyncWriter(\n    asyncfile: aiocsv.protocols.WithAsyncWrite,\n    dialect: str | csv.Dialect | Type[csv.Dialect] = \"excel\",\n    **csv_dialect_kwargs: Unpack[aiocsv.protocols.CsvDialectKwargs],\n)\n```\n\nAn object that writes csv rows to the given asynchronous file.\nIn this object \"row\" is a sequence of values.\n\nAdditional keyword arguments are passed to the underlying csv.writer instance.\n\n*Methods*:\n- `async writerow(self, row: Iterable[Any]) -> None`:\n    Writes one row to the specified file.\n- `async writerows(self, rows: Iterable[Iterable[Any]]) -> None`:\n    Writes multiple rows to the specified file.\n\n*Readonly properties*:\n- `dialect`: Link to underlying's csv.writer's `dialect` attribute\n\n\n### aiocsv.AsyncDictWriter\n\n```\nAsyncDictWriter(\n    asyncfile: aiocsv.protocols.WithAsyncWrite,\n    fieldnames: Sequence[str],\n    restval: Any = \"\",\n    extrasaction: Literal[\"raise\", \"ignore\"] = \"raise\",\n    dialect: str | csv.Dialect | Type[csv.Dialect] = \"excel\",\n    **csv_dialect_kwargs: Unpack[aiocsv.protocols.CsvDialectKwargs],\n)\n```\n\nAn object that writes csv rows to the given asynchronous file.\nIn this object \"row\" is a mapping from fieldnames to values.\n\nAdditional keyword arguments are passed to the underlying csv.DictWriter instance.\n\n*Methods*:\n- `async writeheader(self) -> None`: Writes header row to the specified file.\n- `async writerow(self, row: Mapping[str, Any]) -> None`:\n    Writes one row to the specified file.\n- `async writerows(self, rows: Iterable[Mapping[str, Any]]) -> None`:\n    Writes multiple rows to the specified file.\n\n*Properties*:\n- `fieldnames`: Sequence of keys to identify the order of values when writing rows\n    to the underlying file\n- `restval`: Placeholder value used when a key from fieldnames is missing in a row,\n    defaults to `\"\"`\n- `extrasaction`: Action to take when there are keys in a row, which are not present in\n    fieldnames, defaults to `\"raise\"` which causes ValueError to be raised on extra keys,\n    may be also set to `\"ignore\"` to ignore any extra keys\n- `writer`: Link to the underlying `AsyncWriter`\n\n*Readonly properties*:\n- `dialect`: Link to underlying's csv.reader's `dialect` attribute\n\n\n### aiocsv.protocols.WithAsyncRead\nA `typing.Protocol` describing an asynchronous file, which can be read.\n\n\n### aiocsv.protocols.WithAsyncWrite\nA `typing.Protocol` describing an asynchronous file, which can be written to.\n\n\n### aiocsv.protocols.CsvDialectArg\nType of the `dialect` argument, as used in the `csv` module.\n\n\n### aiocsv.protocols.CsvDialectKwargs\nKeyword arguments used by `csv` module to override the dialect settings during reader/writer\ninstantiation.\n\n## Development\n\nContributions are welcome, however please open an issue beforehand. `aiocsv` is meant as\na replacement for the built-in `csv`, any features not present in the latter will be rejected.\n\n### Building from source\n\nTo create a wheel (and a source tarball), run `python -m build`.\n\nFor local development, use a [virtual environment](https://docs.python.org/3/library/venv.html).\n`pip install --editable .` will build the C extension and make it available for the current\nvenv. This is required for running the tests. However, [due to the mess of Python packaging](https://docs.python.org/3/library/venv.html)\nthis will force an optimized build without debugging symbols. If you need to debug the C part\nof aiocsv and build the library with e.g. debugging symbols, the only sane way is to\nrun `python setup.py build --debug` and manually copy the shared object/DLL from `build/lib*/aiocsv`\nto `aiocsv`.\n\n### Tests\n\nThis project uses [pytest](https://docs.pytest.org/en/latest/contents.html) with\n[pytest-asyncio](https://pypi.org/project/pytest-asyncio/) for testing. Run `pytest`\nafter installing the library in the manner explained above.\n\n### Linting & other tools\n\nThis library uses [black](https://pypi.org/project/black/) and [isort](https://pypi.org/project/isort/)\nfor formatting and [pyright](https://github.com/microsoft/pyright) in strict mode for type checking.\n\nFor the C part of library, please use [clang-format](https://clang.llvm.org/docs/ClangFormat.html)\nfor formatting and [clang-tidy](https://clang.llvm.org/extra/clang-tidy/) linting,\nhowever this are not yet integrated in the CI.\n\n### Installing required tools\n\n`pip install -r requirements.dev.txt` will pull all of the development tools mentioned above,\nhowever this might not be necessary depending on your setup. For example, if you use VS Code\nwith the Python extension, pyright is already bundled and doesn't need to be installed again. \n\n### Recommended VS Code settings\n\nUse [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python),\n[Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)\n(should be installed automatically alongside Python extension),\n[black](https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter) and\n[isort](https://marketplace.visualstudio.com/items?itemName=ms-python.isort) Python extensions.\n\nYou will need to install all dev dependencies from `requirements.dev.txt`, except for `pyright`.\nRecommended `.vscode/settings.json`:\n\n```json\n{\n    \"C_Cpp.codeAnalysis.clangTidy.enabled\": true,\n    \"python.testing.pytestArgs\": [\n        \".\"\n    ],\n    \"python.testing.unittestEnabled\": false,\n    \"python.testing.pytestEnabled\": true,\n    \"[python]\": {\n        \"editor.formatOnSave\": true,\n        \"editor.codeActionsOnSave\": {\n            \"source.organizeImports\": \"always\"\n        }\n    },\n    \"[c]\": {\n        \"editor.formatOnSave\": true\n    }\n}\n```\n\nFor the C part of the library, [C/C++ extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) is sufficient.\nEnsure that your system has Python headers installed. Usually a separate package like python3-dev\nneeds to be installed, consult with your system repositories on that. `.vscode/c_cpp_properties.json`\nneeds to manually include Python headers under `includePath`. On my particular system this\nconfig file looks like this:\n\n```json\n{\n    \"configurations\": [\n        {\n            \"name\": \"Linux\",\n            \"includePath\": [\n                \"${workspaceFolder}/**\",\n                \"/usr/include/python3.11\"\n            ],\n            \"defines\": [],\n            \"compilerPath\": \"/usr/bin/clang\",\n            \"cStandard\": \"c17\",\n            \"cppStandard\": \"c++17\",\n            \"intelliSenseMode\": \"linux-clang-x64\"\n        }\n    ],\n    \"version\": 4\n}\n```\n",
    "bugtrack_url": null,
    "license": null,
    "summary": null,
    "version": "1.3.2",
    "project_urls": {
        "Homepage": "https://github.com/MKuranowski/aiocsv"
    },
    "split_keywords": [
        "async",
        " asynchronous",
        " csv",
        " tsv"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5bacf16d8ac8f340f84102294837cbf1ee8a30a211270f49f91ccc084f0bea93",
                "md5": "e292bc2c742439f7cca2b985635f4def",
                "sha256": "f1996ac960c196aecc7d22e701c273a2676d13bf25575af78d4e515fc724ef20"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e292bc2c742439f7cca2b985635f4def",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 26421,
            "upload_time": "2024-04-28T10:35:41",
            "upload_time_iso_8601": "2024-04-28T10:35:41.197535Z",
            "url": "https://files.pythonhosted.org/packages/5b/ac/f16d8ac8f340f84102294837cbf1ee8a30a211270f49f91ccc084f0bea93/aiocsv-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7dd5616a3d7b07558ee1010cf233784bf1a6844b0664e92a489a380b887ff773",
                "md5": "60bfbf2ebb140a2fbb811730eff6407b",
                "sha256": "bdd688dbc1723f2b3a433e42041ceb9c9a8fe70f547d35b2da4ea31e4c78efc5"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "60bfbf2ebb140a2fbb811730eff6407b",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 47958,
            "upload_time": "2024-04-28T10:35:42",
            "upload_time_iso_8601": "2024-04-28T10:35:42.717311Z",
            "url": "https://files.pythonhosted.org/packages/7d/d5/616a3d7b07558ee1010cf233784bf1a6844b0664e92a489a380b887ff773/aiocsv-1.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "661be03e1469ff228ac0a2c852d6fadfeebacd347f11f7aedd5818f7d42e0ba1",
                "md5": "b4b76880f5d8e4c22f108ba4fc0a6079",
                "sha256": "2f921828e386bb6945ed7d268e1524349ea506974ae35b9772542714f0ef3efd"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp310-cp310-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b4b76880f5d8e4c22f108ba4fc0a6079",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 52246,
            "upload_time": "2024-04-28T10:35:44",
            "upload_time_iso_8601": "2024-04-28T10:35:44.774560Z",
            "url": "https://files.pythonhosted.org/packages/66/1b/e03e1469ff228ac0a2c852d6fadfeebacd347f11f7aedd5818f7d42e0ba1/aiocsv-1.3.2-cp310-cp310-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ac69d6da552b7fe5d2908c9bfbcc62c100cf19eaaf711a213cb9f84448569765",
                "md5": "afeb7f59b676d58b52b29c26440b902c",
                "sha256": "198c905ec29897c347bf9b18eb410af13d7ac94a03d4b673e64eaa5f4557c913"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "afeb7f59b676d58b52b29c26440b902c",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 29080,
            "upload_time": "2024-04-28T10:35:46",
            "upload_time_iso_8601": "2024-04-28T10:35:46.408987Z",
            "url": "https://files.pythonhosted.org/packages/ac/69/d6da552b7fe5d2908c9bfbcc62c100cf19eaaf711a213cb9f84448569765/aiocsv-1.3.2-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d6b3548e5b377f65d3ae02c0674a54de76c150c8d050f4fe7b0e43be866ba1be",
                "md5": "4be4351b9c09792ee644f33b20f3d1de",
                "sha256": "7c25ad8afbf79d28ec3320e608c7f38d3eff93e96ebbbd2430ae8fa0f6e7631b"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4be4351b9c09792ee644f33b20f3d1de",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 26420,
            "upload_time": "2024-04-28T10:35:47",
            "upload_time_iso_8601": "2024-04-28T10:35:47.945371Z",
            "url": "https://files.pythonhosted.org/packages/d6/b3/548e5b377f65d3ae02c0674a54de76c150c8d050f4fe7b0e43be866ba1be/aiocsv-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0dbc2659b85488b520d66b31ac83f42f7493653f61a4941b4f0807f3f73bd3e0",
                "md5": "8fda36188e6a38e5b6f392483a57a8d8",
                "sha256": "4004569bff39cb839a335b8f673a6496fd5b0b6e074c7adb7aee4a0c8379ea22"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "8fda36188e6a38e5b6f392483a57a8d8",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 49433,
            "upload_time": "2024-04-28T10:35:49",
            "upload_time_iso_8601": "2024-04-28T10:35:49.428197Z",
            "url": "https://files.pythonhosted.org/packages/0d/bc/2659b85488b520d66b31ac83f42f7493653f61a4941b4f0807f3f73bd3e0/aiocsv-1.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "41c20f7d38cf5411350b8448f7c5c77f65247224fa96edfc7a5e997deb5fc96d",
                "md5": "00907af2f9be0a51db4ee85077a3eebb",
                "sha256": "e9c98f8d760add0b52274523baa4b81dde4a3c96f79222d3d4d6965bac9cdcbd"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp311-cp311-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "00907af2f9be0a51db4ee85077a3eebb",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 54346,
            "upload_time": "2024-04-28T10:35:50",
            "upload_time_iso_8601": "2024-04-28T10:35:50.888547Z",
            "url": "https://files.pythonhosted.org/packages/41/c2/0f7d38cf5411350b8448f7c5c77f65247224fa96edfc7a5e997deb5fc96d/aiocsv-1.3.2-cp311-cp311-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "33e65e661bc89cd094a7d92f5883c16f9651a52c4a8f38623c8de1851d7ffa84",
                "md5": "5bc715ff6481f50f6e39f510ee7f907e",
                "sha256": "9edb342b0d7dba94d8976f46ba5814b8d8704d67a45e1b8a6579ab0ba04309e7"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "5bc715ff6481f50f6e39f510ee7f907e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 29090,
            "upload_time": "2024-04-28T10:35:52",
            "upload_time_iso_8601": "2024-04-28T10:35:52.357113Z",
            "url": "https://files.pythonhosted.org/packages/33/e6/5e661bc89cd094a7d92f5883c16f9651a52c4a8f38623c8de1851d7ffa84/aiocsv-1.3.2-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "52b548e8b825d8ec9ffbb47ebbc381702d5dfb59ef01ad00174bf43123b860cf",
                "md5": "aea2a53654d6c0146c634b186162057e",
                "sha256": "db943a463cb6828ba81bd7c083c6dd4c96edac4880b8638af81798d694405e26"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "aea2a53654d6c0146c634b186162057e",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 26497,
            "upload_time": "2024-04-28T10:35:53",
            "upload_time_iso_8601": "2024-04-28T10:35:53.272809Z",
            "url": "https://files.pythonhosted.org/packages/52/b5/48e8b825d8ec9ffbb47ebbc381702d5dfb59ef01ad00174bf43123b860cf/aiocsv-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "946fcb2d7b751a03433a30e7a645f0b3a126f5f2ecb0947c3da5a04496c06767",
                "md5": "bd06255b6c00723de3447b1a83c74916",
                "sha256": "10780033a1ed3da825f2256449d177b7106b3c5a2d64bd683eab37f1fdee1e36"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "bd06255b6c00723de3447b1a83c74916",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 51459,
            "upload_time": "2024-04-28T10:35:54",
            "upload_time_iso_8601": "2024-04-28T10:35:54.747152Z",
            "url": "https://files.pythonhosted.org/packages/94/6f/cb2d7b751a03433a30e7a645f0b3a126f5f2ecb0947c3da5a04496c06767/aiocsv-1.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c21967edf04b47168a2639d73ebaae25f2459d7284d10a5e7a2fef72a69bb31e",
                "md5": "89cc6797c32f6f918e2bf2f8605eb7e5",
                "sha256": "8c7aee34ceff4eaa654f01acbdba648297f5f9532dc7a23fac62defec28e0fe5"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp312-cp312-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "89cc6797c32f6f918e2bf2f8605eb7e5",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 55921,
            "upload_time": "2024-04-28T10:35:56",
            "upload_time_iso_8601": "2024-04-28T10:35:56.205335Z",
            "url": "https://files.pythonhosted.org/packages/c2/19/67edf04b47168a2639d73ebaae25f2459d7284d10a5e7a2fef72a69bb31e/aiocsv-1.3.2-cp312-cp312-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1339ee5645807a947736c87ab7c0dfcdbceb7d7f8d1d31cb7d52992cbd5d6d44",
                "md5": "ccadcca20e29f6e31674ee5864ef84a1",
                "sha256": "59b0ea2d9e73539d4c1276467c4457acafa995717ea1b5340f3737f2cde2f71a"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "ccadcca20e29f6e31674ee5864ef84a1",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 29137,
            "upload_time": "2024-04-28T10:35:57",
            "upload_time_iso_8601": "2024-04-28T10:35:57.094415Z",
            "url": "https://files.pythonhosted.org/packages/13/39/ee5645807a947736c87ab7c0dfcdbceb7d7f8d1d31cb7d52992cbd5d6d44/aiocsv-1.3.2-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6b6968459f9a556be05a467b544f49149dc3709e3ecd927e530424daae5df2f2",
                "md5": "1d6d52a4b44d4c43958afcfb7d742d7b",
                "sha256": "1c7d1700b8de16f25b24bfcebfc2b0817b29ce413f6961f08d5aa95bf00a6862"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1d6d52a4b44d4c43958afcfb7d742d7b",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 26653,
            "upload_time": "2024-04-28T10:35:57",
            "upload_time_iso_8601": "2024-04-28T10:35:57.945087Z",
            "url": "https://files.pythonhosted.org/packages/6b/69/68459f9a556be05a467b544f49149dc3709e3ecd927e530424daae5df2f2/aiocsv-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0b4404c10f8504fbce091e7df1f8e27923e5017aef7eec56ff4775d8f8c0112f",
                "md5": "f1dbb5ddc035bb955f03692f5a2f1173",
                "sha256": "9aa9629c8a1c07e9d02c7d80d84f021f7994fe30d021f13ac963e251b54724ef"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f1dbb5ddc035bb955f03692f5a2f1173",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 51230,
            "upload_time": "2024-04-28T10:35:59",
            "upload_time_iso_8601": "2024-04-28T10:35:59.425698Z",
            "url": "https://files.pythonhosted.org/packages/0b/44/04c10f8504fbce091e7df1f8e27923e5017aef7eec56ff4775d8f8c0112f/aiocsv-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6fc5b79a031e733f63c767c9a51a0f13b8e2e84b82c89ca67725be1ba788e627",
                "md5": "379c2e0891991e128db63e0ffede08a8",
                "sha256": "d125286f971e0038e8872f31b6f1cd6184b9c508445e6633f075d8b543b444bc"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp38-cp38-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "379c2e0891991e128db63e0ffede08a8",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 55504,
            "upload_time": "2024-04-28T10:36:00",
            "upload_time_iso_8601": "2024-04-28T10:36:00.950974Z",
            "url": "https://files.pythonhosted.org/packages/6f/c5/b79a031e733f63c767c9a51a0f13b8e2e84b82c89ca67725be1ba788e627/aiocsv-1.3.2-cp38-cp38-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bca22dc29134d9b0c958b7da41c2b998ad25838b4480cccc5d26e7990621edeb",
                "md5": "59746e53bc98377d5e7ee685826aecf9",
                "sha256": "b7220b4a6545abbbb6ab8fe7d4880aa8334f156b872b83641b898df2da9a6484"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "59746e53bc98377d5e7ee685826aecf9",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 29223,
            "upload_time": "2024-04-28T10:36:02",
            "upload_time_iso_8601": "2024-04-28T10:36:02.006130Z",
            "url": "https://files.pythonhosted.org/packages/bc/a2/2dc29134d9b0c958b7da41c2b998ad25838b4480cccc5d26e7990621edeb/aiocsv-1.3.2-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5d489c943de5d9437ef66b3e79cc6f011fe4466c99b274ee9e227e734ac2a421",
                "md5": "7c1b03510328099bb2b1da7cd22c5034",
                "sha256": "dfd2ef214b6d7944991f62ac593ad45bdaf0ed9f5741c8441ee7de148e512fe7"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7c1b03510328099bb2b1da7cd22c5034",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 26693,
            "upload_time": "2024-04-28T10:36:03",
            "upload_time_iso_8601": "2024-04-28T10:36:03.068967Z",
            "url": "https://files.pythonhosted.org/packages/5d/48/9c943de5d9437ef66b3e79cc6f011fe4466c99b274ee9e227e734ac2a421/aiocsv-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4304e6597b11c7e274a3f3f34db30702f33ec25b7513a23fa3bba8b3160aff2a",
                "md5": "77f871c8aa630996ab35925241b9cfb7",
                "sha256": "9c3e5a817b3489283cc1fd80f8ba56431d552dc9ea4e539c0069d8d56bf0fba7"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "77f871c8aa630996ab35925241b9cfb7",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 49220,
            "upload_time": "2024-04-28T10:36:03",
            "upload_time_iso_8601": "2024-04-28T10:36:03.980253Z",
            "url": "https://files.pythonhosted.org/packages/43/04/e6597b11c7e274a3f3f34db30702f33ec25b7513a23fa3bba8b3160aff2a/aiocsv-1.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ce688da12acd1af5b2f954be683fe24a998161c78f08f4b0ff788c1992ec3902",
                "md5": "543ced95b28dcbf97b7b65fddfa54a1d",
                "sha256": "2ef14fa0839394ecc52274ea538b12b7b2e756eb0f514902a8fb391612161079"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp39-cp39-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "543ced95b28dcbf97b7b65fddfa54a1d",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 53588,
            "upload_time": "2024-04-28T10:36:05",
            "upload_time_iso_8601": "2024-04-28T10:36:05.393388Z",
            "url": "https://files.pythonhosted.org/packages/ce/68/8da12acd1af5b2f954be683fe24a998161c78f08f4b0ff788c1992ec3902/aiocsv-1.3.2-cp39-cp39-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "855d7ab47f28fed4776be71048595ed6e4847bfc9286d737526fcf823e3c928f",
                "md5": "d7799be7dc8233862fb7a8cabd5abc46",
                "sha256": "17341fa3b90414adda6cd8c79efc3c1a3f58a4dc72c2053c4532e82b61ef9f5e"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "d7799be7dc8233862fb7a8cabd5abc46",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 29221,
            "upload_time": "2024-04-28T10:36:06",
            "upload_time_iso_8601": "2024-04-28T10:36:06.657353Z",
            "url": "https://files.pythonhosted.org/packages/85/5d/7ab47f28fed4776be71048595ed6e4847bfc9286d737526fcf823e3c928f/aiocsv-1.3.2-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3378bd4a85d195e57e72837415ef81d26ce6db6fdf185dce8d4f6a7c099ed4af",
                "md5": "d0e3ff1a8929c64cebebddbf2c97bda6",
                "sha256": "806d93465c7808d58d3ff0d2bba270fb4d04b934be6a1e95d0834c50a510910e"
            },
            "downloads": -1,
            "filename": "aiocsv-1.3.2.tar.gz",
            "has_sig": false,
            "md5_digest": "d0e3ff1a8929c64cebebddbf2c97bda6",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 24837,
            "upload_time": "2024-04-28T10:30:30",
            "upload_time_iso_8601": "2024-04-28T10:30:30.382760Z",
            "url": "https://files.pythonhosted.org/packages/33/78/bd4a85d195e57e72837415ef81d26ce6db6fdf185dce8d4f6a7c099ed4af/aiocsv-1.3.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-28 10:30:30",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "MKuranowski",
    "github_project": "aiocsv",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "typing_extensions",
            "specs": []
        }
    ],
    "lcname": "aiocsv"
}
        
Elapsed time: 2.67341s