无法使用Python脚本和通配符将多个文件上载到AWS S3

无法使用Python脚本和通配符将多个文件上载到AWS S3,python,amazon-s3,aws-sdk,boto3,Python,Amazon S3,Aws Sdk,Boto3,我刚开始使用python和AWS 我正试图通过python脚本将具有特定格式的各种文件从本地pc移动到S3 AWS文件夹中。在脚本中实现通配符以同时捕获各种文件时,我遇到了一个问题。我能够使用字符串“data=open('file_example_here.csv”,“rb')”一次移动一个文件,尽管我一直在调整python脚本以捕获所有文件(即.csv或所有.json文件)。下面详细介绍了一组文件示例,因此,如果我想在脚本中使用通配符将所有.json文件移动到我的s3实例中,我如何调整脚本以处

我刚开始使用python和AWS

我正试图通过python脚本将具有特定格式的各种文件从本地pc移动到S3 AWS文件夹中。在脚本中实现通配符以同时捕获各种文件时,我遇到了一个问题。我能够使用字符串“data=open('file_example_here.csv”,“rb')”一次移动一个文件,尽管我一直在调整python脚本以捕获所有文件(即.csv或所有.json文件)。下面详细介绍了一组文件示例,因此,如果我想在脚本中使用通配符将所有.json文件移动到我的s3实例中,我如何调整脚本以处理该问题?如果可能的话

如有任何帮助,我们将不胜感激,下面将分享实施情况


/home/user/folder1/c_log_1-10-19.csv
/home/user/folder1/c_log_2-10-19.csv
/home/user/folder1/c_log_3-10-19.csv
/home/user/folder1/c_log_4-10-19.csv
/home/user/folder1/c_log_5-10-19.csv
/home/user/folder1/c_log_6-10-19.csv

/home/user/folder1/h_log_1-11-18.json
/home/user/folder1/h_log_2-11-18.json
/home/user/folder1/h_log_3-11-18.json
/home/user/folder1/h_log_4-11-18.json
/home/user/folder1/h_log_5-11-18.json
/home/user/folder1/h_log_6-11-18.json

import boto3
from botocore.client import Config

ACCESS_KEY_ID = 'key_id_here'
ACCESS_SECRET_KEY = 'secret_key_here'
BUCKET_NAME = 'bucket_name_here'

data = open('test_file.csv', 'rb')

s3 = boto3.resource(
    's3',
    aws_access_key_id=ACCESS_KEY_ID,
    aws_secret_access_key=ACCESS_SECRET_KEY,
    config=Config(signature_version='s3v4')
)
s3.Bucket(BUCKET_NAME).put_object(Key='folder_test/folder_test_2/test_file.csv', Body=data)

print ("All_Done")


````````````````````````````````````````````````````
################################################
############## UPDATED CODE BELOW ############
################################################
import glob
import boto3
from botocore.client import Config

ACCESS_KEY_ID = 'some_key'
ACCESS_SECRET_KEY = 'some_key'
BUCKET_NAME = 'some_bucket'

#session = boto3.Session(profile_name='default')
s3 = boto3.resource(
    's3',
    aws_access_key_id=ACCESS_KEY_ID,
    aws_secret_access_key=ACCESS_SECRET_KEY,
    config=Config(signature_version='s3v4')
)

csv_files = glob.glob("/home/user/Desktop/*.csv")
#json_files = glob.glob("/home/user/folder1/h_log_*.json")

for filename in csv_files:
    print("Putting %s" % filename)
    s3.upload_file(filename, BUCKET_NAME, filename)

#for filename in json_files:
#    print("Putting %s" % filename)
#    s3.upload_file(filename, BUCKET_NAME, filename)

s3.Bucket(BUCKET_NAME).put_object(Key='folder1/folder1', Body=csv_files)

print("All_Done")

检查glob模块()

然后在这些列表上迭代,并按您所做的方式上载


此外,不需要从文件中读入数据。只需在bucket上使用upload_file方法:

您可以使用Python模块这样简单的方法来查找与指定模式匹配的所有文件,如下例所示:

#!/usr/bin/env python

import glob
import boto3
import os

BUCKET_NAME = 'MyBucket'
FOLDER_NAME = 'folder1/folder1'

session = boto3.Session(profile_name='default')
s3 = session.client('s3')

csv_files = glob.glob("/home/user/folder1/c_log_*.csv")
json_files = glob.glob("/home/user/folder1/h_log_*.json")

for filename in csv_files:
    key = "%s/%s" % (FOLDER_NAME, os.path.basename(filename))
    print("Putting %s as %s" % (filename,key))
    s3.upload_file(filename, BUCKET_NAME, key)

for filename in json_files:
    key = "%s/%s" % (FOLDER_NAME, os.path.basename(filename))
    print("Putting %s as %s" % (filename,key))
    s3.upload_file(filename, BUCKET_NAME, key)

print("All_Done")
以上代码假设您安装了AWS CLI,并在默认配置文件下配置了访问密钥。如果没有,可以使用各种方法。


可能有一种更具python风格的方法来实现这一点,但这个简单的脚本可以工作。

感谢您的回复,我将上面的代码更新为原始代码。尽管有没有一种方法可以构造代码,使其仍然保持一个字符串,该字符串将代码放在s3上的特定文件夹中(.e.s3.Bucket(Bucket_NAME)。put_object(Key='folder1/folder1',Body=csv_files)。此外,我在字符串上得到一个错误(s3.upload_file(filename,Bucket_NAME,filename)>>,其中(attributeerror:'s3.serviceresource'对象没有“upload_file”属性)?您是否可以在@Ashaman Kingpin之前跳过该属性?@bobparker,是的,upload_file调用的第三个参数是可以包含文件夹名的对象密钥名。是否只提取文件名(例如c_log_1-10-19.csv)并放入特定文件夹(第1页/第1页)?如果是这样,我已经修改了上面的代码以执行此操作。@bobparker,至于您得到的错误,请注意,在我的代码中,我使用的是boto3.Session,而您使用的是boto3.resource。这可能是错误的原因。您是否可以改为使用该会话,或者您是否必须出于特定原因使用该资源?@bobparker看起来像是在使用该资源API比客户端API好。如果您愿意,我将在今晚晚些时候翻译代码,以便通过客户端使用资源。如果不需要,请告诉我。再次感谢,我现在能够将.csv文件传递到s3实例,尽管我现在在将其放入bucket中的特定文件夹时遇到了问题。这样做有效>>>>s3.上传_文件(文件名,BUCKET_名称,文件名)这不是s3.上传_文件(文件名,BUCKET_名称,'folder1/')@Ashaman-Kingpin
#!/usr/bin/env python

import glob
import boto3
import os

BUCKET_NAME = 'MyBucket'
FOLDER_NAME = 'folder1/folder1'

session = boto3.Session(profile_name='default')
s3 = session.client('s3')

csv_files = glob.glob("/home/user/folder1/c_log_*.csv")
json_files = glob.glob("/home/user/folder1/h_log_*.json")

for filename in csv_files:
    key = "%s/%s" % (FOLDER_NAME, os.path.basename(filename))
    print("Putting %s as %s" % (filename,key))
    s3.upload_file(filename, BUCKET_NAME, key)

for filename in json_files:
    key = "%s/%s" % (FOLDER_NAME, os.path.basename(filename))
    print("Putting %s as %s" % (filename,key))
    s3.upload_file(filename, BUCKET_NAME, key)

print("All_Done")