stouputils 1.6.1__tar.gz → 1.6.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. {stouputils-1.6.1 → stouputils-1.6.2}/PKG-INFO +1 -1
  2. {stouputils-1.6.1 → stouputils-1.6.2}/pyproject.toml +1 -1
  3. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/io.py +145 -0
  4. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/io.pyi +64 -0
  5. {stouputils-1.6.1 → stouputils-1.6.2}/.gitignore +0 -0
  6. {stouputils-1.6.1 → stouputils-1.6.2}/LICENSE +0 -0
  7. {stouputils-1.6.1 → stouputils-1.6.2}/README.md +0 -0
  8. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/__init__.py +0 -0
  9. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/__init__.pyi +0 -0
  10. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/__main__.py +0 -0
  11. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/all_doctests.py +0 -0
  12. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/all_doctests.pyi +0 -0
  13. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/applications/__init__.py +0 -0
  14. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/applications/__init__.pyi +0 -0
  15. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/applications/automatic_docs.py +0 -0
  16. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/applications/automatic_docs.pyi +0 -0
  17. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/applications/upscaler/__init__.py +0 -0
  18. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/applications/upscaler/__init__.pyi +0 -0
  19. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/applications/upscaler/config.py +0 -0
  20. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/applications/upscaler/config.pyi +0 -0
  21. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/applications/upscaler/image.py +0 -0
  22. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/applications/upscaler/image.pyi +0 -0
  23. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/applications/upscaler/video.py +0 -0
  24. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/applications/upscaler/video.pyi +0 -0
  25. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/archive.py +0 -0
  26. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/archive.pyi +0 -0
  27. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/backup.py +0 -0
  28. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/backup.pyi +0 -0
  29. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/collections.py +0 -0
  30. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/collections.pyi +0 -0
  31. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/continuous_delivery/__init__.py +0 -0
  32. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/continuous_delivery/__init__.pyi +0 -0
  33. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/continuous_delivery/cd_utils.py +0 -0
  34. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/continuous_delivery/cd_utils.pyi +0 -0
  35. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/continuous_delivery/github.py +0 -0
  36. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/continuous_delivery/github.pyi +0 -0
  37. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/continuous_delivery/pypi.py +0 -0
  38. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/continuous_delivery/pypi.pyi +0 -0
  39. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/continuous_delivery/pyproject.py +0 -0
  40. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/continuous_delivery/pyproject.pyi +0 -0
  41. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/continuous_delivery/stubs.py +0 -0
  42. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/continuous_delivery/stubs.pyi +0 -0
  43. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/ctx.py +0 -0
  44. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/ctx.pyi +0 -0
  45. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/config/get.py +0 -0
  46. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/config/set.py +0 -0
  47. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/__init__.py +0 -0
  48. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/auto_contrast.py +0 -0
  49. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/axis_flip.py +0 -0
  50. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/bias_field_correction.py +0 -0
  51. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/binary_threshold.py +0 -0
  52. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/blur.py +0 -0
  53. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/brightness.py +0 -0
  54. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/canny.py +0 -0
  55. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/clahe.py +0 -0
  56. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/common.py +0 -0
  57. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/contrast.py +0 -0
  58. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/curvature_flow_filter.py +0 -0
  59. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/denoise.py +0 -0
  60. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/histogram_equalization.py +0 -0
  61. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/invert.py +0 -0
  62. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/laplacian.py +0 -0
  63. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/median_blur.py +0 -0
  64. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/noise.py +0 -0
  65. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/normalize.py +0 -0
  66. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/random_erase.py +0 -0
  67. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/resize.py +0 -0
  68. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/rotation.py +0 -0
  69. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/salt_pepper.py +0 -0
  70. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/sharpening.py +0 -0
  71. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/shearing.py +0 -0
  72. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/threshold.py +0 -0
  73. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/translation.py +0 -0
  74. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image/zoom.py +0 -0
  75. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image_augmentation.py +0 -0
  76. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/image_preprocess.py +0 -0
  77. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/prosthesis_detection.py +0 -0
  78. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/data_processing/technique.py +0 -0
  79. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/dataset/__init__.py +0 -0
  80. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/dataset/dataset.py +0 -0
  81. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/dataset/dataset_loader.py +0 -0
  82. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/dataset/grouping_strategy.py +0 -0
  83. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/dataset/image_loader.py +0 -0
  84. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/dataset/xy_tuple.py +0 -0
  85. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/metric_dictionnary.py +0 -0
  86. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/metric_utils.py +0 -0
  87. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/mlflow_utils.py +0 -0
  88. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/abstract_model.py +0 -0
  89. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/all.py +0 -0
  90. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/base_keras.py +0 -0
  91. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras/all.py +0 -0
  92. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras/convnext.py +0 -0
  93. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras/densenet.py +0 -0
  94. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras/efficientnet.py +0 -0
  95. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras/mobilenet.py +0 -0
  96. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras/resnet.py +0 -0
  97. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras/squeezenet.py +0 -0
  98. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras/vgg.py +0 -0
  99. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras/xception.py +0 -0
  100. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras_utils/callbacks/__init__.py +0 -0
  101. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras_utils/callbacks/colored_progress_bar.py +0 -0
  102. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras_utils/callbacks/learning_rate_finder.py +0 -0
  103. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras_utils/callbacks/model_checkpoint_v2.py +0 -0
  104. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras_utils/callbacks/progressive_unfreezing.py +0 -0
  105. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras_utils/callbacks/warmup_scheduler.py +0 -0
  106. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras_utils/losses/__init__.py +0 -0
  107. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras_utils/losses/next_generation_loss.py +0 -0
  108. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/keras_utils/visualizations.py +0 -0
  109. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/model_interface.py +0 -0
  110. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/models/sandbox.py +0 -0
  111. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/range_tuple.py +0 -0
  112. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/scripts/augment_dataset.py +0 -0
  113. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/scripts/exhaustive_process.py +0 -0
  114. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/scripts/preprocess_dataset.py +0 -0
  115. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/scripts/routine.py +0 -0
  116. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/data_science/utils.py +0 -0
  117. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/decorators.py +0 -0
  118. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/decorators.pyi +0 -0
  119. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/image.py +0 -0
  120. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/image.pyi +0 -0
  121. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/installer/__init__.py +0 -0
  122. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/installer/__init__.pyi +0 -0
  123. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/installer/common.py +0 -0
  124. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/installer/common.pyi +0 -0
  125. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/installer/downloader.py +0 -0
  126. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/installer/downloader.pyi +0 -0
  127. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/installer/linux.py +0 -0
  128. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/installer/linux.pyi +0 -0
  129. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/installer/main.py +0 -0
  130. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/installer/main.pyi +0 -0
  131. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/installer/windows.py +0 -0
  132. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/installer/windows.pyi +0 -0
  133. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/parallel.py +0 -0
  134. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/parallel.pyi +0 -0
  135. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/print.py +0 -0
  136. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/print.pyi +0 -0
  137. {stouputils-1.6.1 → stouputils-1.6.2}/stouputils/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stouputils
3
- Version: 1.6.1
3
+ Version: 1.6.2
4
4
  Summary: Stouputils is a collection of utility modules designed to simplify and enhance the development process. It includes a range of tools for tasks such as execution of doctests, display utilities, decorators, as well as context managers, and many more.
5
5
  Project-URL: Homepage, https://github.com/Stoupy51/stouputils
6
6
  Project-URL: Issues, https://github.com/Stoupy51/stouputils/issues
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
5
5
 
6
6
  [project]
7
7
  name = "stouputils"
8
- version = "1.6.1"
8
+ version = "1.6.2"
9
9
  description = "Stouputils is a collection of utility modules designed to simplify and enhance the development process. It includes a range of tools for tasks such as execution of doctests, display utilities, decorators, as well as context managers, and many more."
10
10
  readme = "README.md"
11
11
  requires-python = ">=3.10"
@@ -5,6 +5,8 @@ This module provides utilities for file management.
5
5
  - relative_path: Get the relative path of a file relative to a given directory
6
6
  - super_json_dump: Writes the provided data to a JSON file with a specified indentation depth.
7
7
  - super_json_load: Load a JSON file from the given path
8
+ - super_csv_dump: Writes data to a CSV file with customizable options
9
+ - super_csv_load: Load a CSV file from the given path
8
10
  - super_copy: Copy a file (or a folder) from the source to the destination (always create the directory)
9
11
  - super_open: Open a file with the given mode, creating the directory if it doesn't exist (only if writing)
10
12
  - replace_tilde: Replace the "~" by the user's home directory
@@ -15,9 +17,11 @@ This module provides utilities for file management.
15
17
  """
16
18
 
17
19
  # Imports
20
+ import csv
18
21
  import os
19
22
  import re
20
23
  import shutil
24
+ from io import StringIO
21
25
  from typing import IO, Any
22
26
 
23
27
  import orjson
@@ -139,6 +143,147 @@ def super_json_load(file_path: str) -> Any:
139
143
  with super_open(file_path, "r") as f:
140
144
  return orjson.loads(f.read())
141
145
 
146
+ # CSV dump to file
147
+ def super_csv_dump(data: Any, file: IO[Any] | None = None, delimiter: str = ',', has_header: bool = True, index: bool = False, *args: Any, **kwargs: Any) -> str:
148
+ """ Writes data to a CSV file with customizable options
149
+
150
+ Args:
151
+ data (list[list[Any]] | list[dict[str, Any]] | pd.DataFrame | pl.DataFrame): The data to write, either a list of lists, list of dicts, pandas DataFrame, or Polars DataFrame
152
+ file (IO[Any]): The file to dump the data to, if None, the data is returned as a string
153
+ delimiter (str): The delimiter to use (default: ',')
154
+ has_header (bool): Whether to include headers (default: True, applies to dict and DataFrame data)
155
+ index (bool): Whether to include the index (default: False, only applies to pandas DataFrame)
156
+ *args: Additional positional arguments to pass to the underlying CSV writer or DataFrame method
157
+ **kwargs: Additional keyword arguments to pass to the underlying CSV writer or DataFrame method
158
+ Returns:
159
+ str: The CSV content as a string
160
+
161
+ Examples:
162
+
163
+ >>> super_csv_dump([["a", "b", "c"], [1, 2, 3], [4, 5, 6]])
164
+ 'a,b,c\\r\\n1,2,3\\r\\n4,5,6\\r\\n'
165
+
166
+ >>> super_csv_dump([{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}])
167
+ 'name,age\\r\\nAlice,30\\r\\nBob,25\\r\\n'
168
+ """
169
+ if not data:
170
+ return ""
171
+ output = StringIO()
172
+
173
+ # Handle Polars DataFrame
174
+ try:
175
+ import polars as pl # type: ignore # noqa: F401
176
+ copy_kwargs = kwargs.copy()
177
+ copy_kwargs.setdefault("separator", delimiter)
178
+ copy_kwargs.setdefault("include_header", has_header)
179
+ copy_kwargs.setdefault("line_terminator", "\r\n")
180
+ data.write_csv(output, *args, **copy_kwargs)
181
+ except AttributeError:
182
+ pass
183
+
184
+ # Handle pandas DataFrame
185
+ try:
186
+ import pandas as pd # type: ignore # noqa: F401
187
+ copy_kwargs = kwargs.copy()
188
+ copy_kwargs.setdefault("index", index)
189
+ copy_kwargs.setdefault("sep", delimiter)
190
+ copy_kwargs.setdefault("header", has_header)
191
+ copy_kwargs.setdefault("lineterminator", "\r\n")
192
+ data.to_csv(output, *args, **copy_kwargs)
193
+ except AttributeError:
194
+ pass
195
+
196
+ # Handle list of dicts
197
+ if isinstance(data[0], dict):
198
+ fieldnames = list(data[0].keys())
199
+ kwargs.setdefault("fieldnames", fieldnames)
200
+ kwargs.setdefault("delimiter", delimiter)
201
+ kwargs.setdefault("lineterminator", "\r\n")
202
+ dict_writer = csv.DictWriter(output, *args, **kwargs)
203
+ if has_header:
204
+ dict_writer.writeheader()
205
+ dict_writer.writerows(data) # type: ignore
206
+
207
+ # Handle list of lists
208
+ else:
209
+ kwargs.setdefault("delimiter", delimiter)
210
+ kwargs.setdefault("lineterminator", "\r\n")
211
+ list_writer = csv.writer(output, *args, **kwargs)
212
+ list_writer.writerows(data)
213
+
214
+ content: str = output.getvalue()
215
+ if file:
216
+ file.write(content)
217
+ output.close()
218
+ return content
219
+
220
+ # CSV load from file path
221
+ def super_csv_load(file_path: str, delimiter: str = ',', has_header: bool = True, as_dict: bool = False, as_dataframe: bool = False, use_polars: bool = False, *args: Any, **kwargs: Any) -> Any:
222
+ """ Load a CSV file from the given path
223
+
224
+ Args:
225
+ file_path (str): The path to the CSV file
226
+ delimiter (str): The delimiter used in the CSV (default: ',')
227
+ has_header (bool): Whether the CSV has a header row (default: True)
228
+ as_dict (bool): Whether to return data as list of dicts (default: False)
229
+ as_dataframe (bool): Whether to return data as a DataFrame (default: False)
230
+ use_polars (bool): Whether to use Polars instead of pandas for DataFrame (default: False, requires polars)
231
+ *args: Additional positional arguments to pass to the underlying CSV reader or DataFrame method
232
+ **kwargs: Additional keyword arguments to pass to the underlying CSV reader or DataFrame method
233
+ Returns:
234
+ list[list[str]] | list[dict[str, str]] | pd.DataFrame | pl.DataFrame: The content of the CSV file
235
+
236
+ Examples:
237
+
238
+ .. code-block:: python
239
+
240
+ > Assuming "test.csv" contains: a,b,c\\n1,2,3\\n4,5,6
241
+ > super_csv_load("test.csv")
242
+ [['1', '2', '3'], ['4', '5', '6']]
243
+
244
+ > super_csv_load("test.csv", as_dict=True)
245
+ [{'a': '1', 'b': '2', 'c': '3'}, {'a': '4', 'b': '5', 'c': '6'}]
246
+
247
+ > super_csv_load("test.csv", as_dataframe=True)
248
+ a b c
249
+ 0 1 2 3
250
+ 1 4 5 6
251
+
252
+ > super_csv_load("test.csv", as_dataframe=True, use_polars=True)
253
+ shape: (2, 3)
254
+ ┌─────┬─────┬─────┐
255
+ │ a ┆ b ┆ c │
256
+ │ --- ┆ --- ┆ --- │
257
+ │ i64 ┆ i64 ┆ i64 │
258
+ ╞═════╪═════╪═════╡
259
+ │ 1 ┆ 2 ┆ 3 │
260
+ │ 4 ┆ 5 ┆ 6 │
261
+ └─────┴─────┴─────┘
262
+ """ # noqa: E101
263
+ # Handle DataFrame loading
264
+ if as_dataframe:
265
+ if use_polars:
266
+ import polars as pl # type: ignore
267
+ kwargs.setdefault("separator", delimiter)
268
+ kwargs.setdefault("has_header", has_header)
269
+ return pl.read_csv(file_path, *args, **kwargs)
270
+ else:
271
+ import pandas as pd # type: ignore
272
+ kwargs.setdefault("sep", delimiter)
273
+ kwargs.setdefault("header", 0 if has_header else None)
274
+ return pd.read_csv(file_path, *args, **kwargs) # type: ignore
275
+
276
+ # Handle dict or list
277
+ with super_open(file_path, "r") as f:
278
+ if as_dict or has_header:
279
+ kwargs.setdefault("delimiter", delimiter)
280
+ reader = csv.DictReader(f, *args, **kwargs)
281
+ return list(reader)
282
+ else:
283
+ kwargs.setdefault("delimiter", delimiter)
284
+ reader = csv.reader(f, *args, **kwargs)
285
+ return list(reader)
286
+
142
287
  # For easy file copy
143
288
  def super_copy(src: str, dst: str, create_dir: bool = True, symlink: bool = False) -> str:
144
289
  """ Copy a file (or a folder) from the source to the destination
@@ -65,6 +65,70 @@ def super_json_load(file_path: str) -> Any:
65
65
  \tReturns:
66
66
  \t\tAny: The content of the JSON file
67
67
  \t"""
68
+ def super_csv_dump(data: Any, file: IO[Any] | None = None, delimiter: str = ',', has_header: bool = True, index: bool = False, *args: Any, **kwargs: Any) -> str:
69
+ ''' Writes data to a CSV file with customizable options
70
+
71
+ \tArgs:
72
+ \t\tdata (list[list[Any]] | list[dict[str, Any]] | pd.DataFrame | pl.DataFrame): The data to write, either a list of lists, list of dicts, pandas DataFrame, or Polars DataFrame
73
+ \t\tfile (IO[Any]): The file to dump the data to, if None, the data is returned as a string
74
+ \t\tdelimiter (str): The delimiter to use (default: \',\')
75
+ \t\thas_header (bool): Whether to include headers (default: True, applies to dict and DataFrame data)
76
+ \t\tindex (bool): Whether to include the index (default: False, only applies to pandas DataFrame)
77
+ \t\t*args: Additional positional arguments to pass to the underlying CSV writer or DataFrame method
78
+ \t\t**kwargs: Additional keyword arguments to pass to the underlying CSV writer or DataFrame method
79
+ \tReturns:
80
+ \t\tstr: The CSV content as a string
81
+
82
+ \tExamples:
83
+
84
+ \t\t>>> super_csv_dump([["a", "b", "c"], [1, 2, 3], [4, 5, 6]])
85
+ \t\t\'a,b,c\\r\\n1,2,3\\r\\n4,5,6\\r\\n\'
86
+
87
+ \t\t>>> super_csv_dump([{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}])
88
+ \t\t\'name,age\\r\\nAlice,30\\r\\nBob,25\\r\\n\'
89
+ \t'''
90
+ def super_csv_load(file_path: str, delimiter: str = ',', has_header: bool = True, as_dict: bool = False, as_dataframe: bool = False, use_polars: bool = False, *args: Any, **kwargs: Any) -> Any:
91
+ ''' Load a CSV file from the given path
92
+
93
+ \tArgs:
94
+ \t\tfile_path (str): The path to the CSV file
95
+ \t\tdelimiter (str): The delimiter used in the CSV (default: \',\')
96
+ \t\thas_header (bool): Whether the CSV has a header row (default: True)
97
+ \t\tas_dict (bool): Whether to return data as list of dicts (default: False)
98
+ \t\tas_dataframe (bool): Whether to return data as a DataFrame (default: False)
99
+ \t\tuse_polars (bool): Whether to use Polars instead of pandas for DataFrame (default: False, requires polars)
100
+ \t\t*args: Additional positional arguments to pass to the underlying CSV reader or DataFrame method
101
+ \t\t**kwargs: Additional keyword arguments to pass to the underlying CSV reader or DataFrame method
102
+ \tReturns:
103
+ \t\tlist[list[str]] | list[dict[str, str]] | pd.DataFrame | pl.DataFrame: The content of the CSV file
104
+
105
+ \tExamples:
106
+
107
+ \t\t.. code-block:: python
108
+
109
+ \t\t\t> Assuming "test.csv" contains: a,b,c\\n1,2,3\\n4,5,6
110
+ \t\t\t> super_csv_load("test.csv")
111
+ \t\t\t[[\'1\', \'2\', \'3\'], [\'4\', \'5\', \'6\']]
112
+
113
+ \t\t\t> super_csv_load("test.csv", as_dict=True)
114
+ \t\t\t[{\'a\': \'1\', \'b\': \'2\', \'c\': \'3\'}, {\'a\': \'4\', \'b\': \'5\', \'c\': \'6\'}]
115
+
116
+ \t\t\t> super_csv_load("test.csv", as_dataframe=True)
117
+ \t\t\t a b c
118
+ \t\t\t0 1 2 3
119
+ \t\t\t1 4 5 6
120
+
121
+ \t\t\t> super_csv_load("test.csv", as_dataframe=True, use_polars=True)
122
+ \t\t\tshape: (2, 3)
123
+ \t\t\t┌─────┬─────┬─────┐
124
+ \t\t\t│ a ┆ b ┆ c │
125
+ \t\t\t│ --- ┆ --- ┆ --- │
126
+ \t\t\t│ i64 ┆ i64 ┆ i64 │
127
+ \t\t\t╞═════╪═════╪═════╡
128
+ \t\t\t│ 1 ┆ 2 ┆ 3 │
129
+ \t\t\t│ 4 ┆ 5 ┆ 6 │
130
+ \t\t\t└─────┴─────┴─────┘
131
+ \t'''
68
132
  def super_copy(src: str, dst: str, create_dir: bool = True, symlink: bool = False) -> str:
69
133
  """ Copy a file (or a folder) from the source to the destination
70
134
 
File without changes
File without changes
File without changes
File without changes