polars_python/functions/
io.rs1use std::io::BufReader;
2
3#[cfg(any(feature = "ipc", feature = "parquet"))]
4use polars::prelude::ArrowSchema;
5use pyo3::prelude::*;
6use pyo3::types::PyDict;
7
8use crate::conversion::Wrap;
9use crate::error::PyPolarsErr;
10use crate::file::{EitherRustPythonFile, get_either_file};
11
12#[cfg(feature = "ipc")]
13#[pyfunction]
14pub fn read_ipc_schema(py: Python<'_>, py_f: PyObject) -> PyResult<Bound<'_, PyDict>> {
15 use arrow::io::ipc::read::read_file_metadata;
16 let metadata = match get_either_file(py_f, false)? {
17 EitherRustPythonFile::Rust(r) => {
18 read_file_metadata(&mut BufReader::new(r)).map_err(PyPolarsErr::from)?
19 },
20 EitherRustPythonFile::Py(mut r) => read_file_metadata(&mut r).map_err(PyPolarsErr::from)?,
21 };
22
23 let dict = PyDict::new(py);
24 fields_to_pydict(&metadata.schema, &dict)?;
25 Ok(dict)
26}
27
28#[cfg(feature = "parquet")]
29#[pyfunction]
30pub fn read_parquet_metadata(py: Python, py_f: PyObject) -> PyResult<Bound<PyDict>> {
31 use polars_parquet::read::read_metadata;
32 use polars_parquet::read::schema::read_custom_key_value_metadata;
33
34 let metadata = match get_either_file(py_f, false)? {
35 EitherRustPythonFile::Rust(r) => {
36 read_metadata(&mut BufReader::new(r)).map_err(PyPolarsErr::from)?
37 },
38 EitherRustPythonFile::Py(mut r) => read_metadata(&mut r).map_err(PyPolarsErr::from)?,
39 };
40
41 let key_value_metadata = read_custom_key_value_metadata(metadata.key_value_metadata());
42 let dict = PyDict::new(py);
43 for (key, value) in key_value_metadata.into_iter() {
44 dict.set_item(key.as_str(), value.as_str())?;
45 }
46 Ok(dict)
47}
48
49#[cfg(any(feature = "ipc", feature = "parquet"))]
50fn fields_to_pydict(schema: &ArrowSchema, dict: &Bound<'_, PyDict>) -> PyResult<()> {
51 for field in schema.iter_values() {
52 let dt = Wrap(polars::prelude::DataType::from_arrow_field(field));
53 dict.set_item(field.name.as_str(), &dt)?;
54 }
55 Ok(())
56}
57
58#[cfg(feature = "clipboard")]
59#[pyfunction]
60pub fn read_clipboard_string() -> PyResult<String> {
61 use arboard;
62 let mut clipboard =
63 arboard::Clipboard::new().map_err(|e| PyPolarsErr::Other(format!("{e}")))?;
64 let result = clipboard
65 .get_text()
66 .map_err(|e| PyPolarsErr::Other(format!("{e}")))?;
67 Ok(result)
68}
69
70#[cfg(feature = "clipboard")]
71#[pyfunction]
72pub fn write_clipboard_string(s: &str) -> PyResult<()> {
73 use arboard;
74 let mut clipboard =
75 arboard::Clipboard::new().map_err(|e| PyPolarsErr::Other(format!("{e}")))?;
76 clipboard
77 .set_text(s)
78 .map_err(|e| PyPolarsErr::Other(format!("{e}")))?;
79 Ok(())
80}