将文件放入 Python 中的变量文件夹时遇到问题

Getting Trouble in Placing files in variable Folder in Python

我正在从 s3 存储桶下载文件,我想将它们放在各自的文件夹中。

with open(wrkbk, 'r') as csvfile:
    datareader = csv.reader(csvfile)
for row in datareader:
    stage, path = row[0],row[1]
    fpath  = os.path.join("C://Users//local1//Project101//Images//",stage)
    your_bucket.download_file(path,fpath+path)

我要的是图片去

**Images->Stage-1->image1.jpg
        Stage-2-> image2.jpg**
         .
         .

但实际情况是这样的。

Images-> Stage-1image1.jpg, Stage-2image2.jpg

我已经在Image文件夹中制作了所有的舞台文件夹,所以我没有尝试os.makedir()

它不会进入单独的文件夹。我试过做fpath/path,但是它的saying字符串不能分割。

而且它们不会进入文件夹,相反,名称会与文件夹一起保留。

最后一段也需要使用 os.path.join(),所以有一个斜杠 in-between。

我还添加了 os.path.basename(),以防 CSV 文件的 path 也有目录部分...

base = "C:/Users/local1/Project101/Images"

with open(wrkbk) as csvfile:
    datareader = csv.reader(csvfile)

    for stage, path in datareader:
        filename = os.path.basename(path)
        full_path = os.path.join(base, stage, filename)
        your_bucket.download_file(path,full_path)

下面的函数将存储桶路径的所有文件下载到本地目录。 路径是文件的指示 - 当它不以“/”结尾时 它将创建您下载到的根本地目录的递归目录

import boto3
import os
s3 = boto3.resource('s3')

def download_s3_folder(bucket_name, s3_folder, local_dir=None):
    bucket = s3.Bucket(bucket_name)
    for obj in bucket.objects.filter(Prefix=s3_folder):
        if obj.key[-1] == '/':
            continue
        target = os.path.join(local_dir, os.path.relpath(obj.key, s3_folder))
        if not os.path.exists(os.path.dirname(target)):
            os.makedirs(os.path.dirname(target))
        print(f"downloading {obj.key} to {target}")
        bucket.download_file(obj.key, target)

使用示例

download_s3_folder("MY_BUCKET", "PATH/Images/", "./Images")

会将 MY_BUCKET 存储桶中路径 PATH/Images/ 中的所有内容下载到当前工作目录 运行 目录 ./Images 中的脚本并将保留 files/paths结构

为了在保持 files/paths 结构的同时下载所有存储桶内容,请使用 -

download_s3_folder("MY_BUCKET", "", "./my-bucket-content")