polars_python/dataframe/
serde.rs

1use std::io::{BufReader, BufWriter};
2use std::ops::Deref;
3
4use polars::prelude::*;
5use polars_io::mmap::ReaderBytes;
6use pyo3::prelude::*;
7
8use super::PyDataFrame;
9use crate::error::PyPolarsErr;
10use crate::exceptions::ComputeError;
11use crate::file::{get_file_like, get_mmap_bytes_reader};
12use crate::utils::EnterPolarsExt;
13
14#[pymethods]
15impl PyDataFrame {
16    /// Serialize into binary data.
17    fn serialize_binary(slf: Bound<'_, Self>, py_f: PyObject) -> PyResult<()> {
18        let file = get_file_like(py_f, true)?;
19        let mut writer = BufWriter::new(file);
20
21        Ok(slf
22            .borrow()
23            .df
24            .write()
25            .serialize_into_writer(&mut writer)
26            .map_err(PyPolarsErr::from)?)
27    }
28
29    /// Deserialize a file-like object containing binary data into a DataFrame.
30    #[staticmethod]
31    fn deserialize_binary(py: Python<'_>, py_f: PyObject) -> PyResult<Self> {
32        let file = get_file_like(py_f, false)?;
33        let mut file = BufReader::new(file);
34
35        py.enter_polars_df(|| DataFrame::deserialize_from_reader(&mut file))
36    }
37
38    /// Serialize into a JSON string.
39    #[cfg(feature = "json")]
40    pub fn serialize_json(&self, py: Python<'_>, py_f: PyObject) -> PyResult<()> {
41        let file = get_file_like(py_f, true)?;
42        let writer = BufWriter::new(file);
43        py.enter_polars(|| {
44            serde_json::to_writer(writer, &*self.df.read())
45                .map_err(|err| ComputeError::new_err(err.to_string()))
46        })
47    }
48
49    /// Deserialize a file-like object containing JSON string data into a DataFrame.
50    #[staticmethod]
51    #[cfg(feature = "json")]
52    pub fn deserialize_json(py: Python<'_>, py_f: Bound<PyAny>) -> PyResult<Self> {
53        let mut mmap_bytes_r = get_mmap_bytes_reader(&py_f)?;
54
55        py.enter_polars(move || {
56            let mmap_read: ReaderBytes = (&mut mmap_bytes_r).into();
57            let bytes = mmap_read.deref();
58            let df = serde_json::from_slice::<DataFrame>(bytes)
59                .map_err(|err| ComputeError::new_err(err.to_string()))?;
60            PyResult::Ok(df.into())
61        })
62    }
63}