将整个文件夹从本地移动到S3

3
我需要将一个文件夹从本地移动到s3,想了解是否有方法实现此操作。我的文件夹包含子文件夹和其中的文件(通常为.pdf或.doc或.docx)。我知道可以使用s3fshttps://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 SDK。没有AWS API调用来移动多个文件,因此@Seth建议使用 AWS命令行界面(CLI),它具有递归代码以移动多个文件。或者,您可以简单地循环遍历输入文件并将每个文件复制到S3。在S3中不需要创建目标目录,您只需指定完整的目标路径即可。 - John Rotenstein
3个回答

7

我知道这可能有些过时,也有可能在问问题的时候这个功能还不存在,但是使用 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)

1
在调用 S3FileSystem.put 时,您能否设置 ACL?在文档或源代码中没有看到任何相关内容。 - Andrew Eckart

1

使用 AWS CLI,您可以使用 cp 命令并添加 --recursive 标志:

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

谢谢。但是我没有使用AWS CLI。 - Magofoco
是的...但也许像这样的方法可以让你在Python代码中使用CLI?(https://dev59.com/0mAg5IYBdhLWcg3wSpPD) - Seth E

1
核心 AWS S3 API 没有可以一次上传多个文件的功能。
由于所有更高级别的 API 实现都倾向于镜像 S3 提供的主要 API。这包括 boto3 和 s3fs,它们不会添加这样的功能。如果由于某种原因无法使用 AWS cli,则需要一次上传一个文件,并自己确保将本地文件结构镜像到远程 S3 上传中。
如果您自己实现此功能,您需要决定更改本地文件名以用作 S3 键的规则,并且可能想要研究使用多线程或多进程同时上传几个文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接