Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-python/src/dataframe/serde.rs
7889 views
1
use std::io::{BufReader, BufWriter};
2
use std::ops::Deref;
3
4
use polars::prelude::*;
5
use polars_io::mmap::ReaderBytes;
6
use pyo3::prelude::*;
7
8
use super::PyDataFrame;
9
use crate::error::PyPolarsErr;
10
use crate::exceptions::ComputeError;
11
use crate::file::{get_file_like, get_mmap_bytes_reader};
12
use crate::utils::EnterPolarsExt;
13
14
#[pymethods]
15
impl PyDataFrame {
16
/// Serialize into binary data.
17
fn serialize_binary(slf: Bound<'_, Self>, py_f: Py<PyAny>) -> 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: Py<PyAny>) -> 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: Py<PyAny>) -> 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
}
64
65