From b140f6d065c46743cc394371fbd4f6e4fb86a2ff Mon Sep 17 00:00:00 2001 From: alihajiali Date: Thu, 26 Dec 2024 11:53:26 +0330 Subject: [PATCH] c --- requirements.txt | 2 + .gitignore | 173 ++++++++++++++++++++++++++++++++++++++++++++++ 1.xlsx | Bin 0 -> 14552 bytes README.md | 10 +++ xl/main.py | 46 ++++++++++++ 5 files changed, 231 insertions(+) create mode 100644 requirements.txt create mode 100644 .gitignore create mode 100644 1.xlsx create mode 100644 README.md create mode 100644 xl/main.py diff --git a/ requirements.txt b/ requirements.txt new file mode 100644 index 0000000..24d5b06 --- /dev/null +++ b/ requirements.txt @@ -0,0 +1,2 @@ +et_xmlfile==2.0.0 +openpyxl==3.1.5 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a86b1e7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,173 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST +requirements.txt +setup.py +ultralytics.egg-info + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other info into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +mlruns/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# Profiling +*.pclprof + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +.idea +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# VSCode project settings +.vscode/ + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# datasets and projects (ignore /datasets dir at root only to allow for docs/en/datasets dir) +/datasets +runs/ +wandb/ +.DS_Store + +# Neural Network weights ----------------------------------------------------------------------------------------------- +weights/ +*.weights +*.pt +*.pb +*.onnx +*.engine +*.mlmodel +*.mlpackage +*.torchscript +*.tflite +*.h5 +*.mnn +*_saved_model/ +*_web_model/ +*_openvino_model/ +*_paddle_model/ +*_ncnn_model/ +*_imx_model/ +pnnx* + +# Autogenerated files for tests +/ultralytics/assets/ + +# calibration image +calibration_*.npy \ No newline at end of file diff --git a/1.xlsx b/1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4872ac60e17910e34a2104d07d9f063fa5d828c1 GIT binary patch literal 14552 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 X4h3llpe_Iah``U!w>!|-exCggb%N;B literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..006d9ab --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +example usage : + + +``` python +file_path = "./1.xlsx" +sheet_name = "Sheet" +with XL(file_path) as excel_to_dict: + data = excel_to_dict.sheet_to_dict(sheet_name) +print(data) +``` \ No newline at end of file diff --git a/xl/main.py b/xl/main.py new file mode 100644 index 0000000..7e63bcb --- /dev/null +++ b/xl/main.py @@ -0,0 +1,46 @@ +import openpyxl + +class XL: + def __init__(self, file_path: str): + """ + Initialize the class with the path to the Excel file. + """ + self.file_path = file_path + self.workbook = None + + def __enter__(self): + """ + Open the workbook when entering the context. + """ + self.workbook = openpyxl.load_workbook(self.file_path) + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """ + Close the workbook when exiting the context. + """ + if self.workbook: + self.workbook.close() + + def sheet_to_dict(self, sheet_name: str): + """ + Convert a sheet's data to a dictionary, removing rows with None values. + """ + if not self.workbook: + raise ValueError("Workbook is not loaded. Ensure you use 'with' to open the file.") + + if sheet_name not in self.workbook.sheetnames: + raise ValueError(f"Sheet '{sheet_name}' not found in the workbook.") + + sheet = self.workbook[sheet_name] + headers = [cell.value for cell in sheet[1] if cell.value is not None] + + data_list = [] + for row in sheet.iter_rows(min_row=2, values_only=True): + row_dict = {headers[i]: cell for i, cell in enumerate(row) if i < len(headers)} + # Remove keys with None values + row_dict = {key: value for key, value in row_dict.items() if value is not None} + if row_dict: # Only include non-empty rows + data_list.append(row_dict) + + return data_list \ No newline at end of file