.. Licensed to the Apache Software Foundation (ASF) under one
.. or more contributor license agreements.  See the NOTICE file
.. distributed with this work for additional information
.. regarding copyright ownership.  The ASF licenses this file
.. to you under the Apache License, Version 2.0 (the
.. "License"); you may not use this file except in compliance
.. with the License.  You may obtain a copy of the License at

..   http://www.apache.org/licenses/LICENSE-2.0

.. Unless required by applicable law or agreed to in writing,
.. software distributed under the License is distributed on an
.. "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
.. KIND, either express or implied.  See the License for the
.. specific language governing permissions and limitations
.. under the License.

.. currentmodule:: pyarrow.csv
.. _py-csv:

Reading and Writing CSV files
=============================

Arrow supports reading and writing columnar data from/to CSV files.
The features currently offered are the following:

* multi-threaded or single-threaded reading
* automatic decompression of input files (based on the filename extension,
  such as ``my_data.csv.gz``)
* fetching column names from the first row in the CSV file
* column-wise type inference and conversion to one of ``null``, ``int64``,
  ``float64``, ``date32``, ``time32[s]``, ``timestamp[s]``, ``timestamp[ns]``,
  ``duration`` (from numeric strings), ``string`` or ``binary`` data
* opportunistic dictionary encoding of ``string`` and ``binary`` columns
  (disabled by default)
* detecting various spellings of null values such as ``NaN`` or ``#N/A``
* writing CSV files with options to configure the exact output format

Usage
-----

CSV reading and writing functionality is available through the
:mod:`pyarrow.csv` module.  In many cases, you will simply call the
:func:`read_csv` function with the file path you want to read from:

.. code-block:: python

   >>> from pyarrow import csv
   >>> import pyarrow as pa
   >>> import pandas as pd
   >>> fn = 'tips.csv.gz'  # doctest: +SKIP
   >>> table = csv.read_csv(fn)  # doctest: +SKIP
   >>> table  # doctest: +SKIP
   pyarrow.Table
   total_bill: double
   tip: double
   sex: string
   smoker: string
   day: string
   time: string
   size: int64
   >>> len(table)  # doctest: +SKIP
   244
   >>> df = table.to_pandas()  # doctest: +SKIP
   >>> df.head()  # doctest: +SKIP
      total_bill   tip     sex smoker  day    time  size
   0       16.99  1.01  Female     No  Sun  Dinner     2
   1       10.34  1.66    Male     No  Sun  Dinner     3
   2       21.01  3.50    Male     No  Sun  Dinner     3
   3       23.68  3.31    Male     No  Sun  Dinner     2
   4       24.59  3.61  Female     No  Sun  Dinner     4

To write CSV files, just call :func:`write_csv` with a
:class:`pyarrow.RecordBatch` or :class:`pyarrow.Table` and a path or
file-like object:

.. code-block:: python

  >>> table = pa.table({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']})
  >>> csv.write_csv(table, "tips.csv")
  >>> with pa.CompressedOutputStream("tips.csv.gz", "gzip") as out:
  ...     csv.write_csv(table, out)

.. note:: The writer does not yet support all Arrow types.

Customized parsing
------------------

To alter the default parsing settings in case of reading CSV files with an
unusual structure, you should create a :class:`ParseOptions` instance
and pass it to :func:`read_csv`:

.. code-block:: python

    >>> def skip_handler(row):
    ...     pass
    >>> table = csv.read_csv('tips.csv.gz', parse_options=csv.ParseOptions(
    ...    delimiter=";",
    ...    invalid_row_handler=skip_handler
    ... ))
    >>> table
    pyarrow.Table
    col1,"col2": string
    ----
    col1,"col2": [["1,"a"","2,"b"","3,"c""]]

Available parsing options are:

.. autosummary::

  ~ParseOptions.delimiter
  ~ParseOptions.quote_char
  ~ParseOptions.double_quote
  ~ParseOptions.escape_char
  ~ParseOptions.newlines_in_values
  ~ParseOptions.ignore_empty_lines
  ~ParseOptions.invalid_row_handler

.. seealso::

   For more examples see :class:`ParseOptions`.

Customized conversion
---------------------

To alter how CSV data is converted to Arrow types and data, you should create
a :class:`ConvertOptions` instance and pass it to :func:`read_csv`:

.. code-block:: python

   >>> table = csv.read_csv('tips.csv.gz', convert_options=csv.ConvertOptions(
   ...     column_types={
   ...         'total_bill': pa.decimal128(precision=10, scale=2),
   ...         'tip': pa.decimal128(precision=10, scale=2),
   ...     }
   ... ))
   >>> table
   pyarrow.Table
   col1: int64
   col2: string
   ----
   col1: [[1,2,3]]
   col2: [["a","b","c"]]

.. note::
   To assign a column as ``duration``, the CSV values must be numeric strings
   that match the expected unit (e.g. ``60000`` for 60 seconds when
   using ``duration[ms]``).

Available convert options are:

.. autosummary::

  ~ConvertOptions.check_utf8
  ~ConvertOptions.column_types
  ~ConvertOptions.default_column_type
  ~ConvertOptions.null_values
  ~ConvertOptions.true_values
  ~ConvertOptions.false_values
  ~ConvertOptions.decimal_point
  ~ConvertOptions.timestamp_parsers
  ~ConvertOptions.strings_can_be_null
  ~ConvertOptions.quoted_strings_can_be_null
  ~ConvertOptions.auto_dict_encode
  ~ConvertOptions.auto_dict_max_cardinality
  ~ConvertOptions.include_columns
  ~ConvertOptions.include_missing_columns

.. seealso::

   For more examples see :class:`ConvertOptions`.

Incremental reading
-------------------

For memory-constrained environments, it is also possible to read a CSV file
one batch at a time, using :func:`open_csv`.

There are a few caveats:

1. For now, the incremental reader is always single-threaded (regardless of
   :attr:`ReadOptions.use_threads`)

2. Type inference is done on the first block and types are frozen afterwards;
   to make sure the right data types are inferred, either set
   :attr:`ReadOptions.block_size` to a large enough value, or use
   :attr:`ConvertOptions.column_types` to set the desired data types explicitly.

Character encoding
------------------

By default, CSV files are expected to be encoded in UTF8.  Non-UTF8 data
is accepted for ``binary`` columns.  The encoding can be changed using
the :class:`ReadOptions` class:

.. code-block:: python

   >>> table = csv.read_csv('tips.csv.gz', read_options=csv.ReadOptions(
   ...    column_names=["n_legs", "entry"],
   ...    skip_rows=1
   ... ))
   >>> table
   pyarrow.Table
   n_legs: int64
   entry: string
   ----
   n_legs: [[1,2,3]]
   entry: [["a","b","c"]]

Available read options are:

.. autosummary::

  ~ReadOptions.use_threads
  ~ReadOptions.block_size
  ~ReadOptions.skip_rows
  ~ReadOptions.skip_rows_after_names
  ~ReadOptions.column_names
  ~ReadOptions.autogenerate_column_names
  ~ReadOptions.encoding

.. seealso::

   For more examples see :class:`ReadOptions`.

Customized writing
------------------

To alter the default write settings in case of writing CSV files with
different conventions, you can create a :class:`WriteOptions` instance and
pass it to :func:`write_csv`:

.. code-block:: python

  >>> # Omit the header row (include_header=True is the default)
  >>> options = csv.WriteOptions(include_header=False)
  >>> csv.write_csv(table, "data.csv", options)

Incremental writing
-------------------

To write CSV files one batch at a time, create a :class:`CSVWriter`. This
requires the output (a path or file-like object), the schema of the data to
be written, and optionally write options as described above:

.. code-block:: python

  >>> with csv.CSVWriter("data.csv", table.schema) as writer:
  ...     writer.write_table(table)

Performance
-----------

Due to the structure of CSV files, one cannot expect the same levels of
performance as when reading dedicated binary formats like
:ref:`Parquet <Parquet>`.  Nevertheless, Arrow strives to reduce the
overhead of reading CSV files.  A reasonable expectation is at least
100 MB/s per core on a performant desktop or laptop computer (measured
in source CSV bytes, not target Arrow data bytes).

Performance options can be controlled through the :class:`ReadOptions` class.
Multi-threaded reading is the default for highest performance, distributing
the workload efficiently over all available cores.

.. note::
   The number of concurrent threads is automatically inferred by Arrow.
   You can inspect and change it using the :func:`~pyarrow.cpu_count()`
   and :func:`~pyarrow.set_cpu_count()` functions, respectively.
