{"id":13501531,"url":"https://github.com/liormizr/s3path","last_synced_at":"2026-02-22T11:06:58.328Z","repository":{"id":38153360,"uuid":"149740910","full_name":"liormizr/s3path","owner":"liormizr","description":"s3path is a pathlib extension for AWS S3 Service ","archived":false,"fork":false,"pushed_at":"2026-01-24T17:04:36.000Z","size":542,"stargazers_count":226,"open_issues_count":18,"forks_count":44,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-01-25T05:57:02.888Z","etag":null,"topics":["amazon-s3","amazon-web-services","aws-s3","boto3","python","python3","s3-sdk"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liormizr.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-09-21T09:23:15.000Z","updated_at":"2026-01-24T16:56:27.000Z","dependencies_parsed_at":"2024-01-16T10:36:47.994Z","dependency_job_id":"370d75b9-3423-471c-9efb-73d46aec69bd","html_url":"https://github.com/liormizr/s3path","commit_stats":{"total_commits":250,"total_committers":18,"mean_commits":13.88888888888889,"dds":"0.28800000000000003","last_synced_commit":"f0611c45ac5573e69b0ab389333a9eb64431e7ba"},"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/liormizr/s3path","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liormizr%2Fs3path","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liormizr%2Fs3path/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liormizr%2Fs3path/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liormizr%2Fs3path/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liormizr","download_url":"https://codeload.github.com/liormizr/s3path/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liormizr%2Fs3path/sbom","scorecard":{"id":591861,"data":{"date":"2025-08-11","repo":{"name":"github.com/liormizr/s3path","commit":"cbc37d54d215035351ccc09c56b003e18b408149"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.6,"checks":[{"name":"Code-Review","score":3,"reason":"Found 4/12 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":10,"reason":"12 commit(s) and 8 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploying.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/liormizr/s3path/deploying.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploying.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/liormizr/s3path/deploying.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/testing.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/liormizr/s3path/testing.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/testing.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/liormizr/s3path/testing.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/deploying.yml:18","Warn: pipCommand not pinned by hash: .github/workflows/deploying.yml:19","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/deploying.yml:1","Warn: no topLevel permission defined: .github/workflows/testing.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/deploying.yml:8"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 28 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T22:09:22.100Z","repository_id":38153360,"created_at":"2025-08-20T22:09:22.100Z","updated_at":"2025-08-20T22:09:22.100Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29710317,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-22T10:34:24.778Z","status":"ssl_error","status_checked_at":"2026-02-22T10:32:23.200Z","response_time":110,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amazon-s3","amazon-web-services","aws-s3","boto3","python","python3","s3-sdk"],"created_at":"2024-07-31T22:01:40.746Z","updated_at":"2026-02-22T11:06:58.294Z","avatar_url":"https://github.com/liormizr.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"S3Path\n======\n\n.. image:: https://badgen.net/pypi/v/s3path\n    :target: https://pypi.org/project/s3path/\n    :alt: Latest version\n\n.. image:: https://github.com/liormizr/s3path/actions/workflows/testing.yml/badge.svg?branch=master\u0026event=push\n    :target: https://github.com/liormizr/s3path/actions/workflows/testing.yml\n    :alt: S3Path CI\n\nS3Path provide a Python convenient File-System/Path like interface for AWS S3 Service using boto3 S3 resource as a driver.\n\nLike pathlib, but for S3 Buckets\n________________________________\n\nAWS S3 is among the most popular cloud storage solutions. It's object storage, is built to store and retrieve various amounts of data from anywhere.\n\nCurrently, Python developers use Boto3 as the default API to connect / put / get / list / delete files from S3.\n\nS3Path blends Boto3's ease of use and the familiarity of pathlib api.\n\nInstall:\n========\n\nFrom PyPI:\n\n.. code:: bash\n\n    $ pip install s3path\n\nFrom Conda:\n\n.. code:: bash\n\n    $ conda install -c conda-forge s3path\n\nBasic use:\n==========\n\nThe following example assumes an s3 bucket setup as specified bellow:\n\n.. code:: bash\n\n    $ aws s3 ls s3://pypi-proxy/\n\n    2018-04-24 22:59:59        186 requests/index.html\n    2018-04-24 22:59:57     485015 requests/requests-2.9.1.tar.gz\n    2018-04-24 22:35:01      89112 boto3/boto3-1.4.1.tar.gz\n    2018-04-24 22:35:02        180 boto3/index.html\n    2018-04-24 22:35:19    3308919 botocore/botocore-1.4.93.tar.gz\n    2018-04-24 22:35:36        188 botocore/index.html\n\nImporting the main class:\n\n.. code:: python\n\n   \u003e\u003e\u003e from s3path import S3Path\n\nListing \"subdirectories\" - s3 keys can be split like file-system with a `/` in s3path we:\n\n.. code:: python\n\n   \u003e\u003e\u003e bucket_path = S3Path('/pypi-proxy/')\n   \u003e\u003e\u003e [path for path in bucket_path.iterdir() if path.is_dir()]\n   [S3Path('/pypi-proxy/requests/'),\n    S3Path('/pypi-proxy/boto3/'),\n    S3Path('/pypi-proxy/botocore/')]\n\nListing html source files in this \"directory\" tree:\n\n.. code:: python\n\n   \u003e\u003e\u003e bucket_path = S3Path('/pypi-proxy/')\n   \u003e\u003e\u003e list(bucket_path.glob('**/*.html'))\n   [S3Path('/pypi-proxy/requests/index.html'),\n    S3Path('/pypi-proxy/boto3/index.html'),\n    S3Path('/pypi-proxy/botocore/index.html')]\n\nNavigating inside a \"directory\" tree:\n\n.. code:: python\n\n   \u003e\u003e\u003e bucket_path = S3Path('/pypi-proxy/')\n   \u003e\u003e\u003e boto3_package_path = bucket_path / 'boto3' / 'boto3-1.4.1.tar.gz'\n   \u003e\u003e\u003e boto3_package_path\n   S3Path('/pypi-proxy/boto3/boto3-1.4.1.tar.gz')\n\nQuerying path properties:\n\n.. code:: python\n\n   \u003e\u003e\u003e boto3_package_path = S3Path('/pypi-proxy/boto3/boto3-1.4.1.tar.gz')\n   \u003e\u003e\u003e boto3_package_path.exists()\n   True\n   \u003e\u003e\u003e boto3_package_path.is_dir()\n   False\n   \u003e\u003e\u003e boto3_package_path.is_file()\n   True\n\nOpening a \"file\" (s3 key):\n\n.. code:: python\n\n   \u003e\u003e\u003e botocore_index_path = S3Path('/pypi-proxy/botocore/index.html')\n   \u003e\u003e\u003e with botocore_index_path.open() as f:\n   \u003e\u003e\u003e     print(f.read())\n   \"\"\"\n   \u003c!DOCTYPE html\u003e\n   \u003chtml\u003e\n   \u003chead\u003e\n       \u003cmeta charset=\"UTF-8\"\u003e\n       \u003ctitle\u003ePackage Index\u003c/title\u003e\n   \u003c/head\u003e\n   \u003cbody\u003e\n       \u003ca href=\"botocore-1.4.93.tar.gz\"\u003ebotocore-1.4.93.tar.gz\u003c/a\u003e\u003cbr\u003e\n   \u003c/body\u003e\n   \u003c/html\u003e\n   \"\"\"\n\n\nOr Simply reading:\n\n.. code:: python\n\n   \u003e\u003e\u003e botocore_index_path = S3Path('/pypi-proxy/botocore/index.html')\n   \u003e\u003e\u003e botocore_index_path.read_text()\n   \"\"\"\n   \u003c!DOCTYPE html\u003e\n   \u003chtml\u003e\n   \u003chead\u003e\n       \u003cmeta charset=\"UTF-8\"\u003e\n       \u003ctitle\u003ePackage Index\u003c/title\u003e\n   \u003c/head\u003e\n   \u003cbody\u003e\n       \u003ca href=\"botocore-1.4.93.tar.gz\"\u003ebotocore-1.4.93.tar.gz\u003c/a\u003e\u003cbr\u003e\n   \u003c/body\u003e\n   \u003c/html\u003e\n   \"\"\"\n\nVersioned S3 Objects:\n=====================\n\ns3path supports versioned objects for S3 buckets that have versioning enabled. ``VersionedS3Path`` is a subclass of ``S3Path`` that supports all of its features. The main difference is an additional required ``version_id`` keyword parameter in each of its constructor methods.\n\n.. code:: python\n\n   \u003e\u003e\u003e from s3path import VersionedS3Path\n   \u003e\u003e\u003e bucket, key, version_id = 'my-bucket', 'my-key', 'my-version-id'\n   \u003e\u003e\u003e VersionedS3Path(f'/{bucket}/{key}', version_id=version_id)\n   VersionedS3Path('/my-bucket/my-key', version_id='my-version-id')\n   \u003e\u003e\u003e VersionedS3Path.from_uri(f's3://{bucket}/{key}', version_id=version_id)\n   VersionedS3Path('/my-bucket/my-key', version_id='my-version-id')\n   \u003e\u003e\u003e VersionedS3Path.from_bucket_key(bucket=bucket, key=key, version_id=version_id)\n   VersionedS3Path('/my-bucket/my-key', version_id='my-version-id')\n\nNew in version 0.5.0\n\nRequirements:\n=============\n\n* Python \u003e= 3.4\n* boto3\n* smart-open\n\nFurther Documentation:\n======================\n\n* `Advanced S3Path configuration`_ (S3 parameters, S3-compatible storage, etc.)\n* `Abstract pathlib interface`_ implemented by S3Path\n* `Boto3 vs S3Path usage examples`_\n\n\n.. _Abstract pathlib interface: https://github.com/liormizr/s3path/blob/master/docs/interface.rst\n.. _Boto3 vs S3Path usage examples: https://github.com/liormizr/s3path/blob/master/docs/comparison.rst\n.. _Advanced S3Path configuration: https://github.com/liormizr/s3path/blob/master/docs/advance.rst\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliormizr%2Fs3path","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliormizr%2Fs3path","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliormizr%2Fs3path/lists"}