Mercurial > repos > bimib > cobraxy
comparison COBRAxy/utils/general_utils.py @ 380:03a7ba63813f draft
Uploaded
| author | luca_milaz |
|---|---|
| date | Fri, 05 Sep 2025 08:27:04 +0000 |
| parents | fe87d6fd7884 |
| children | 0a3ca20848f3 |
comparison
equal
deleted
inserted
replaced
| 379:6f0aed06098c | 380:03a7ba63813f |
|---|---|
| 37 PDF = ("pdf",) # this is also a common output format for images, as it's required in publications. | 37 PDF = ("pdf",) # this is also a common output format for images, as it's required in publications. |
| 38 | 38 |
| 39 # Updated to include compressed variants | 39 # Updated to include compressed variants |
| 40 XML = ("xml", "xml.gz", "xml.zip", "xml.bz2") # SBML files are XML files, sometimes compressed | 40 XML = ("xml", "xml.gz", "xml.zip", "xml.bz2") # SBML files are XML files, sometimes compressed |
| 41 JSON = ("json", "json.gz", "json.zip", "json.bz2") # COBRA models can be stored as JSON files, sometimes compressed | 41 JSON = ("json", "json.gz", "json.zip", "json.bz2") # COBRA models can be stored as JSON files, sometimes compressed |
| 42 | 42 MAT = ("mat", "mat.gz", "mat.zip", "mat.bz2") # COBRA models can be stored as MAT files, sometimes compressed |
| 43 TXT = ("txt",) # this is how most output data is written | 43 YML = ("yml", "yml.gz", "yml.zip", "yml.bz2") # COBRA models can be stored as YML files, sometimes compressed |
| 44 | |
| 45 TXT = ("txt",) # this is how most output data is written | |
| 44 PICKLE = ("pickle", "pk", "p") # this is how all runtime data structures are saved | 46 PICKLE = ("pickle", "pk", "p") # this is how all runtime data structures are saved |
| 45 | 47 |
| 46 def __init__(self, *extensions): | 48 def __init__(self, *extensions): |
| 47 self.extensions = extensions | 49 self.extensions = extensions |
| 48 # Store original extension when set via fromExt | 50 # Store original extension when set via fromExt |
| 76 """ | 78 """ |
| 77 (Private) converts to str representation. Good practice for usage with argparse. | 79 (Private) converts to str representation. Good practice for usage with argparse. |
| 78 Returns: | 80 Returns: |
| 79 str : the string representation of the file extension. | 81 str : the string representation of the file extension. |
| 80 """ | 82 """ |
| 81 # If we have an original extension stored (for compressed files), use it | 83 # If we have an original extension stored (for compressed files only), use it |
| 82 if hasattr(self, '_original_extension') and self._original_extension: | 84 if hasattr(self, '_original_extension') and self._original_extension: |
| 83 return self._original_extension | 85 return self._original_extension |
| 84 | 86 |
| 85 # For XML and JSON without original extension, use the base extension | 87 # For XML, JSON, MAT and YML without original extension, use the base extension |
| 86 if self == FileFormat.XML: | 88 if self == FileFormat.XML: |
| 87 return "xml" | 89 return "xml" |
| 88 elif self == FileFormat.JSON: | 90 elif self == FileFormat.JSON: |
| 89 return "json" | 91 return "json" |
| 92 elif self == FileFormat.MAT: | |
| 93 return "mat" | |
| 94 elif self == FileFormat.YML: | |
| 95 return "yml" | |
| 90 | 96 |
| 91 return self.value[-1] | 97 return self.value[-1] |
| 92 | 98 |
| 93 class FilePath(): | 99 class FilePath(): |
| 94 """ | 100 """ |
| 612 if str(ext) in FileFormat.JSON.value: | 618 if str(ext) in FileFormat.JSON.value: |
| 613 # Compressed files are not automatically handled by cobra | 619 # Compressed files are not automatically handled by cobra |
| 614 if(ext == "json"): | 620 if(ext == "json"): |
| 615 return cobra.io.load_json_model(file_path.show()) | 621 return cobra.io.load_json_model(file_path.show()) |
| 616 else: | 622 else: |
| 617 return self.extract_json_model(file_path, ext) | 623 return self.extract_model(file_path, ext, "json") |
| 624 | |
| 625 if str(ext) in FileFormat.MAT.value: | |
| 626 # Compressed files are not automatically handled by cobra | |
| 627 if(ext == "mat"): | |
| 628 return cobra.io.load_matlab_model(file_path.show()) | |
| 629 else: | |
| 630 return self.extract_model(file_path, ext, "mat") | |
| 631 | |
| 632 if str(ext) in FileFormat.YML.value: | |
| 633 # Compressed files are not automatically handled by cobra | |
| 634 if(ext == "yml"): | |
| 635 return cobra.io.load_yaml_model(file_path.show()) | |
| 636 else: | |
| 637 return self.extract_model(file_path, ext, "yml") | |
| 618 | 638 |
| 619 except Exception as e: raise DataErr(file_path, e.__str__()) | 639 except Exception as e: raise DataErr(file_path, e.__str__()) |
| 620 raise DataErr(file_path, | 640 raise DataErr(file_path, |
| 621 f"Fomat \"{file_path.ext}\" is not recognized, only JSON and XML files are supported.") | 641 f"Fomat \"{file_path.ext}\" is not recognized, only JSON, XML, MAT and YAML (.yml) files are supported.") |
| 622 | 642 |
| 623 | 643 |
| 624 def extract_json_model(file_path:FilePath, ext :FileFormat) -> cobra.Model: | 644 def extract_model(file_path:FilePath, ext :FileFormat, model_encoding:Literal["json", "mat", "yml"]) -> cobra.Model: |
| 625 """ | 645 """ |
| 626 Extract json COBRA model from a compressed file (zip, gz, bz2). | 646 Extract JSON, MAT and YAML COBRA model from a compressed file (zip, gz, bz2). |
| 627 | 647 |
| 628 Args: | 648 Args: |
| 629 file_path: File path of the model | 649 file_path: File path of the model |
| 630 ext: File extensions of class FileFormat (should be .zip, .gz or .bz2) | 650 ext: File extensions of class FileFormat (should be .zip, .gz or .bz2) |
| 631 | 651 |
| 640 try: | 660 try: |
| 641 if '.zip' in ext_str: | 661 if '.zip' in ext_str: |
| 642 with zipfile.ZipFile(file_path.show(), 'r') as zip_ref: | 662 with zipfile.ZipFile(file_path.show(), 'r') as zip_ref: |
| 643 with zip_ref.open(zip_ref.namelist()[0]) as json_file: | 663 with zip_ref.open(zip_ref.namelist()[0]) as json_file: |
| 644 content = json_file.read().decode('utf-8') | 664 content = json_file.read().decode('utf-8') |
| 645 return cobra.io.load_json_model(StringIO(content)) | 665 if model_encoding == "json": |
| 666 return cobra.io.load_json_model(StringIO(content)) | |
| 667 elif model_encoding == "mat": | |
| 668 return cobra.io.load_matlab_model(StringIO(content)) | |
| 669 elif model_encoding == "yml": | |
| 670 return cobra.io.load_yaml_model(StringIO(content)) | |
| 671 else: | |
| 672 raise ValueError(f"Unsupported model encoding: {model_encoding}. Supported: json, mat, yml") | |
| 646 elif '.gz' in ext_str: | 673 elif '.gz' in ext_str: |
| 647 with gzip.open(file_path.show(), 'rt', encoding='utf-8') as gz_ref: | 674 with gzip.open(file_path.show(), 'rt', encoding='utf-8') as gz_ref: |
| 648 return cobra.io.load_json_model(gz_ref) | 675 if model_encoding == "json": |
| 676 return cobra.io.load_json_model(gz_ref) | |
| 677 elif model_encoding == "mat": | |
| 678 return cobra.io.load_matlab_model(gz_ref) | |
| 679 elif model_encoding == "yml": | |
| 680 return cobra.io.load_yaml_model(gz_ref) | |
| 681 else: | |
| 682 raise ValueError(f"Unsupported model encoding: {model_encoding}. Supported: json, mat, yml") | |
| 649 elif '.bz2' in ext_str: | 683 elif '.bz2' in ext_str: |
| 650 with bz2.open(file_path.show(), 'rt', encoding='utf-8') as bz2_ref: | 684 with bz2.open(file_path.show(), 'rt', encoding='utf-8') as bz2_ref: |
| 651 return cobra.io.load_json_model(bz2_ref) | 685 if model_encoding == "json": |
| 686 return cobra.io.load_json_model(bz2_ref) | |
| 687 elif model_encoding == "mat": | |
| 688 return cobra.io.load_matlab_model(bz2_ref) | |
| 689 elif model_encoding == "yml": | |
| 690 return cobra.io.load_yaml_model(bz2_ref) | |
| 691 else: | |
| 692 raise ValueError(f"Unsupported model encoding: {model_encoding}. Supported: json, mat, yml") | |
| 652 else: | 693 else: |
| 653 raise ValueError(f"Compression format not supported: {ext_str}. Supported: .zip, .gz and .bz2") | 694 raise ValueError(f"Compression format not supported: {ext_str}. Supported: .zip, .gz and .bz2") |
| 654 | 695 |
| 655 except Exception as e: | 696 except Exception as e: |
| 656 raise Exception(f"Error during model extraction: {str(e)}") | 697 raise Exception(f"Error during model extraction: {str(e)}") |
