diff --git a/pandas/io/parsers/readers.py b/pandas/io/parsers/readers.py index 4fbd71ed03662..53d06272a771a 100644 --- a/pandas/io/parsers/readers.py +++ b/pandas/io/parsers/readers.py @@ -679,6 +679,24 @@ def _read( kwds["parse_dates"] = False else: kwds["parse_dates"] = True + # 🆕 Handle engine='polars' + if kwds.get("engine") == "polars": + try: + import polars as pl + except ImportError: + raise ImportError( + "Polars is not installed. Please install it with 'pip install polars'." + ) + + pl_args = {} + if "nrows" in kwds: + pl_args["n_rows"] = kwds["nrows"] + if "encoding" in kwds: + pl_args["encoding"] = kwds["encoding"] + + df = pl.read_csv(filepath_or_buffer, **pl_args) + return df.to_pandas() + # Extract some of the arguments (pass chunksize on). iterator = kwds.get("iterator", False) @@ -1791,6 +1809,9 @@ def _refine_defaults_read( kwds["delimiter"] = delimiter if engine is not None: + if engine not in ["c", "python", "pyarrow", "polars"]: + raise ValueError(f"Unknown engine: {engine}") + kwds["engine"] = engine kwds["engine_specified"] = True else: kwds["engine"] = "c" diff --git a/pandas/io/parsers/test_read_csv_polars.py b/pandas/io/parsers/test_read_csv_polars.py new file mode 100644 index 0000000000000..2647915d75782 --- /dev/null +++ b/pandas/io/parsers/test_read_csv_polars.py @@ -0,0 +1,12 @@ +import pytest + +def test_read_csv_with_polars(tmp_path): + pl = pytest.importorskip("polars") + pd = pytest.importorskip("pandas") + + file = tmp_path / "data.csv" + file.write_text("a,b\n1,2\n3,4") + + df = pd.read_csv(file, engine="polars") + assert df.shape == (2, 2) + assert list(df.columns) == ["a", "b"]