polars_python/dataframe/
serde.rs1use 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 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 let mut slf_1 = slf.try_borrow_mut();
22 let slf_1: Result<&mut PyDataFrame, _> = slf_1.as_deref_mut();
23 let mut slf_2: Option<PyDataFrame> = (slf_1.is_err()).then(|| (*slf.borrow()).clone());
24
25 let slf: &mut PyDataFrame = slf_1.unwrap_or_else(|_| slf_2.as_mut().unwrap());
26
27 Ok(slf
28 .df
29 .serialize_into_writer(&mut writer)
30 .map_err(PyPolarsErr::from)?)
31 }
32
33 #[staticmethod]
35 fn deserialize_binary(py: Python<'_>, py_f: PyObject) -> PyResult<Self> {
36 let file = get_file_like(py_f, false)?;
37 let mut file = BufReader::new(file);
38
39 py.enter_polars_df(|| DataFrame::deserialize_from_reader(&mut file))
40 }
41
42 #[cfg(feature = "json")]
44 pub fn serialize_json(&mut self, py: Python<'_>, py_f: PyObject) -> PyResult<()> {
45 let file = get_file_like(py_f, true)?;
46 let writer = BufWriter::new(file);
47 py.enter_polars(|| {
48 serde_json::to_writer(writer, &self.df)
49 .map_err(|err| ComputeError::new_err(err.to_string()))
50 })
51 }
52
53 #[staticmethod]
55 #[cfg(feature = "json")]
56 pub fn deserialize_json(py: Python<'_>, py_f: Bound<PyAny>) -> PyResult<Self> {
57 let mut mmap_bytes_r = get_mmap_bytes_reader(&py_f)?;
58
59 py.enter_polars(move || {
60 let mmap_read: ReaderBytes = (&mut mmap_bytes_r).into();
61 let bytes = mmap_read.deref();
62 let df = serde_json::from_slice::<DataFrame>(bytes)
63 .map_err(|err| ComputeError::new_err(err.to_string()))?;
64 PyResult::Ok(df.into())
65 })
66 }
67}