polars_python/functions/
io.rs
1use std::io::BufReader;
2
3use arrow::array::Utf8ViewArray;
4#[cfg(any(feature = "ipc", feature = "parquet"))]
5use polars::prelude::ArrowSchema;
6use polars_core::datatypes::create_enum_dtype;
7use pyo3::prelude::*;
8use pyo3::types::PyDict;
9
10use crate::conversion::Wrap;
11use crate::error::PyPolarsErr;
12use crate::file::{get_either_file, EitherRustPythonFile};
13use crate::prelude::ArrowDataType;
14
15#[cfg(feature = "ipc")]
16#[pyfunction]
17pub fn read_ipc_schema(py: Python, py_f: PyObject) -> PyResult<Bound<PyDict>> {
18 use arrow::io::ipc::read::read_file_metadata;
19 let metadata = match get_either_file(py_f, false)? {
20 EitherRustPythonFile::Rust(r) => {
21 read_file_metadata(&mut BufReader::new(r)).map_err(PyPolarsErr::from)?
22 },
23 EitherRustPythonFile::Py(mut r) => read_file_metadata(&mut r).map_err(PyPolarsErr::from)?,
24 };
25
26 let dict = PyDict::new(py);
27 fields_to_pydict(&metadata.schema, &dict)?;
28 Ok(dict)
29}
30
31#[cfg(feature = "parquet")]
32#[pyfunction]
33pub fn read_parquet_schema(py: Python, py_f: PyObject) -> PyResult<Bound<PyDict>> {
34 use polars_parquet::read::{infer_schema, read_metadata};
35
36 let metadata = match get_either_file(py_f, false)? {
37 EitherRustPythonFile::Rust(r) => {
38 read_metadata(&mut BufReader::new(r)).map_err(PyPolarsErr::from)?
39 },
40 EitherRustPythonFile::Py(mut r) => read_metadata(&mut r).map_err(PyPolarsErr::from)?,
41 };
42 let arrow_schema = infer_schema(&metadata).map_err(PyPolarsErr::from)?;
43
44 let dict = PyDict::new(py);
45 fields_to_pydict(&arrow_schema, &dict)?;
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 = if field.is_enum() {
53 Wrap(create_enum_dtype(Utf8ViewArray::new_empty(
54 ArrowDataType::Utf8View,
55 )))
56 } else {
57 Wrap(polars::prelude::DataType::from_arrow_field(field))
58 };
59 dict.set_item(field.name.as_str(), &dt)?;
60 }
61 Ok(())
62}
63
64#[cfg(feature = "clipboard")]
65#[pyfunction]
66pub fn read_clipboard_string() -> PyResult<String> {
67 use arboard;
68 let mut clipboard =
69 arboard::Clipboard::new().map_err(|e| PyPolarsErr::Other(format!("{e}")))?;
70 let result = clipboard
71 .get_text()
72 .map_err(|e| PyPolarsErr::Other(format!("{e}")))?;
73 Ok(result)
74}
75
76#[cfg(feature = "clipboard")]
77#[pyfunction]
78pub fn write_clipboard_string(s: &str) -> PyResult<()> {
79 use arboard;
80 let mut clipboard =
81 arboard::Clipboard::new().map_err(|e| PyPolarsErr::Other(format!("{e}")))?;
82 clipboard
83 .set_text(s)
84 .map_err(|e| PyPolarsErr::Other(format!("{e}")))?;
85 Ok(())
86}