【问题标题】:Move a whole folder from local to S3将整个文件夹从本地移动到 S3
【发布时间】:2020-02-07 02:24:47
【问题描述】:

我必须将一个文件夹从我的本地移动到 s3。 我想知道是否有办法这样做。

我的文件夹包含嵌套的子文件夹,其中包含文件(通常是 .pdf 或 .doc 或 docx)。

我知道我可以使用 s3fs (https://s3fs.readthedocs.io/en/latest/api.html) 将单个文件从本地移动到 s3:

S3FileSystem.put(filename, path, **kwargs)  Stream data from local filename to file at path

我的代码看起来像

def upload_data(filepath, file_name):
    s3 = s3fs.S3FileSystem()
    s3_path = f"name-of-my-bucket/{file_name}"
    s3.put(filepath, s3_path)

但是这允许我上传单个文件。我想发送整个文件夹。

我可以递归地做,一个一个地添加每个文件,但是:

1) 我认为如果我可以发送文件夹会更容易。

2) 维护文件夹的结构会更加困难。这意味着我的本地文件 folders/subfolders/myfile.pdf 将在 s3 中保存为 mypdf.pdf 而不是 folders/subfolders/myfile.pdf

【问题讨论】:

  • 旁注:s3fs 不是使用 Amazon S3 的标准方式。推荐使用 boto3,它是适用于 Python 的官方 AWS 开发工具包。没有 AWS API 调用来移动多个文件,因此 @Seth 建议使用 AWS Command-Line Interface (CLI),它具有移动多个文件的递归代码。或者,您可以简单地遍历输入文件并将每个文件复制到 S3。 S3中不需要创建目标目录,指定完整的目标路径即可。

标签: python amazon-s3


【解决方案1】:

我知道这已经很老了,可能在询问的时候这个功能不存在,但是使用s3fs你可以简单地设置recursive=True

def upload_data(filepath, file_name):
    s3 = s3fs.S3FileSystem()
    s3_path = f"name-of-my-bucket/{file_name}"
    s3.put(filepath, s3_path, recursive=True)

【讨论】:

    【解决方案2】:

    使用 AWS CLI,您可以使用带有 --recursive 标志的 cp 命令:

    aws s3 cp folders s3://mybucket/ --recursive 
    

    【讨论】:

    • 谢谢。但是我没有使用 AWS CLI。
    • 是的...但也许something like this 可以让您在 Python 代码中使用 CLI?
    【解决方案3】:

    核心AWS S3 API 没有让您一次上传多个文件的功能。

    由于此 API 的所有更高级别的实现都倾向于反映 S3 提供的主要 API。这包括 boto3 和 s3fs,它们没有添加这样的功能。如果由于某种原因无法使用 AWS cli,则需要一次上传一个文件,并注意将本地文件结构镜像到自己的远程 S3 上传。

    如果您自己实现此功能,则需要确定将本地文件名更改为 S3 密钥的规则,并且可能希望考虑使用多线程或多处理一次上传几个文件。

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 1970-01-01
      • 2017-06-10
      • 2019-09-02
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      相关资源
      最近更新 更多