Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python和boto3将AmazonS3文件下载到文件夹中的本地计算机上?_Python_Amazon Web Services_Amazon S3_Boto3 - Fatal编程技术网

如何使用python和boto3将AmazonS3文件下载到文件夹中的本地计算机上?

如何使用python和boto3将AmazonS3文件下载到文件夹中的本地计算机上?,python,amazon-web-services,amazon-s3,boto3,Python,Amazon Web Services,Amazon S3,Boto3,我正在尝试将一个文件从AmazonS3下载到本地机器的预定义文件夹中。这是代码,它工作得很好。但当文件保存时,它会使用路径的lastname保存。我应该如何纠正这个问题 导入boto3 导入操作系统 S3_Object=boto3.client('S3',aws_access_key_id='##',aws_secret_access_key='##') BUCKET_NAME='###' filename2=[] 键2=[] bucket=S3_对象。列出_对象(bucket=bucket_名

我正在尝试将一个文件从AmazonS3下载到本地机器的预定义文件夹中。这是代码,它工作得很好。但当文件保存时,它会使用路径的lastname保存。我应该如何纠正这个问题

导入boto3
导入操作系统
S3_Object=boto3.client('S3',aws_access_key_id='##',aws_secret_access_key='##')
BUCKET_NAME='###'
filename2=[]
键2=[]
bucket=S3_对象。列出_对象(bucket=bucket_名称)['Contents']
下载\u path=target\u file\u path=os.path.join(“…”、“数据”、“lz”、“测试样本”、“样本文件”)
对于钥匙插入桶:
path,filename=os.path.split(key['key'])
filename2.append(文件名)
键2.append(键['key'])
对于键2中的f:
如果f.endswith('.csv'):
#如果f.endswith('.csv'):
印刷品(f)
文件名=str(f.rsplit('/',1)[-1])
打印(文件名)
如果不存在os.path(下载路径):
os.makedirs(下载路径)
其他:
S3_对象。下载_文件(BUCKET_名称,f,下载路径+文件名)
打印(“成功”)

以下函数递归下载文件

目录仅在包含文件时才在本地创建

import boto3
import os

def download_dir(client, resource, dist, local='/tmp', bucket='your_bucket'):
paginator = client.get_paginator('list_objects')
for result in paginator.paginate(Bucket=bucket, Delimiter='/', Prefix=dist):
    if result.get('CommonPrefixes') is not None:
        for subdir in result.get('CommonPrefixes'):
            download_dir(client, resource, subdir.get('Prefix'), local, bucket)
    for file in result.get('Contents', []):
        dest_pathname = os.path.join(local, file.get('Key'))
        if not os.path.exists(os.path.dirname(dest_pathname)):
            os.makedirs(os.path.dirname(dest_pathname))
        resource.meta.client.download_file(bucket, file.get('Key'), dest_pathname)
函数的调用方式如下:

def _start():
    client = boto3.client('s3')
    resource = boto3.resource('s3')
    download_dir(client, resource, 'clientconf/', '/tmp', bucket='my-bucket')
这是我的测试代码

import boto3
import os

s3 = boto3.resource('s3')
bucket = 'your bucket'
response = s3.Bucket(bucket).objects.all()
# If you want to search only specific path of bucket,
#response = s3.Bucket(bucket).objects.filter(Prefix='path')

path = 'your path'
if not os.path.exists(path):
    os.makedirs(path)

for item in response:
    filename = item.key.rsplit('/', 1)[-1]
    if filename.endswith('.csv'):
        s3.Object(bucket, item.key).download_file(path + filename)
        print("success")
我已经测试了代码,它给出了一个正确的名称


怎么了?

我认为,路径的代码中缺少一个
/

print(os.path.join('..', 'data', 'lz', 'test_sample', 'sample_file'))
代码给出了结果:

../data/lz/test_sample/sample_file
因此,在下面的步骤中

S3_Object.download_file(BUCKET_NAME, f, download_path + file_name)
下载路径
+
文件名
将是错误的,它应该是:

S3_Object.download_file(BUCKET_NAME, f, download_path + '/' + file_name)

我可以试试file_name=str(f)吗。然后打印(文件名)“用路径的姓氏保存”是什么意思?我还注意到,如果路径不存在,它会生成目录,但不会下载对象,因为下载代码在
else
中。仍然不是Blackfox。同样的情况也会发生,因为您可以看到john my path=root/data/lz/test_sample/samplefile,假设我想下载名为sss.csv的文件。当它下载到一个特定文件夹时,它会另存为samplefiless.csv。但我需要将它另存为原始名称。(sss.csv)啊。。。路径看起来像windows one,因为我正在使用windows。