Path: blob/main/crates/polars-python/src/functions/io.rs
8353 views
use std::io::BufReader;12#[cfg(any(feature = "ipc", feature = "parquet"))]3use polars::prelude::ArrowSchema;4use polars::prelude::CloudScheme;5use pyo3::prelude::*;6use pyo3::types::PyDict;78use crate::conversion::Wrap;9use crate::error::PyPolarsErr;10use crate::file::{EitherRustPythonFile, get_either_file};11use crate::io::cloud_options::OptPyCloudOptions;1213#[cfg(feature = "ipc")]14#[pyfunction]15pub fn read_ipc_schema(py: Python<'_>, py_f: Py<PyAny>) -> PyResult<Bound<'_, PyDict>> {16use arrow::io::ipc::read::read_file_metadata;17let metadata = match get_either_file(py_f, false)? {18EitherRustPythonFile::Rust(r) => {19read_file_metadata(&mut BufReader::new(r)).map_err(PyPolarsErr::from)?20},21EitherRustPythonFile::Py(mut r) => read_file_metadata(&mut r).map_err(PyPolarsErr::from)?,22};2324let dict = PyDict::new(py);25fields_to_pydict(&metadata.schema, &dict)?;26Ok(dict)27}2829#[cfg(feature = "parquet")]30#[pyfunction]31pub fn read_parquet_metadata(32py: Python,33py_f: Py<PyAny>,34storage_options: OptPyCloudOptions,35credential_provider: Option<Py<PyAny>>,36) -> PyResult<Py<PyDict>> {37use std::io::Cursor;3839use polars_error::feature_gated;40use polars_io::pl_async::get_runtime;41use polars_parquet::read::read_metadata;42use polars_parquet::read::schema::read_custom_key_value_metadata;4344use crate::file::{PythonScanSourceInput, get_python_scan_source_input};4546let metadata = match get_python_scan_source_input(py_f, false)? {47PythonScanSourceInput::Buffer(buf) => {48read_metadata(&mut Cursor::new(buf)).map_err(PyPolarsErr::from)?49},50PythonScanSourceInput::Path(p) => {51let cloud_options = storage_options.extract_opt_cloud_options(52CloudScheme::from_path(p.as_str()),53credential_provider,54)?;5556if p.has_scheme() {57feature_gated!("cloud", {58use polars::prelude::ParquetObjectStore;59use polars_error::PolarsResult;6061py.detach(|| {62get_runtime().block_on(async {63let mut reader =64ParquetObjectStore::from_uri(p, cloud_options.as_ref(), None)65.await?;66let result = reader.get_metadata().await?;67PolarsResult::Ok((**result).clone())68})69})70})71.map_err(PyPolarsErr::from)?72} else {73let file = polars_utils::open_file(p.as_std_path()).map_err(PyPolarsErr::from)?;74read_metadata(&mut BufReader::new(file)).map_err(PyPolarsErr::from)?75}76},77PythonScanSourceInput::File(f) => {78read_metadata(&mut BufReader::new(f)).map_err(PyPolarsErr::from)?79},80};8182let key_value_metadata = read_custom_key_value_metadata(metadata.key_value_metadata());83let dict = PyDict::new(py);84for (key, value) in key_value_metadata.into_iter() {85dict.set_item(key.as_str(), value.as_str())?;86}87Ok(dict.unbind())88}8990#[cfg(any(feature = "ipc", feature = "parquet"))]91fn fields_to_pydict(schema: &ArrowSchema, dict: &Bound<'_, PyDict>) -> PyResult<()> {92for field in schema.iter_values() {93let dt = Wrap(polars::prelude::DataType::from_arrow_field(field));94dict.set_item(field.name.as_str(), &dt)?;95}96Ok(())97}9899#[cfg(feature = "clipboard")]100#[pyfunction]101pub fn read_clipboard_string() -> PyResult<String> {102use arboard;103let mut clipboard =104arboard::Clipboard::new().map_err(|e| PyPolarsErr::Other(format!("{e}")))?;105let result = clipboard106.get_text()107.map_err(|e| PyPolarsErr::Other(format!("{e}")))?;108Ok(result)109}110111#[cfg(feature = "clipboard")]112#[pyfunction]113pub fn write_clipboard_string(s: &str) -> PyResult<()> {114use arboard;115let mut clipboard =116arboard::Clipboard::new().map_err(|e| PyPolarsErr::Other(format!("{e}")))?;117clipboard118.set_text(s)119.map_err(|e| PyPolarsErr::Other(format!("{e}")))?;120Ok(())121}122123124