Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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 无法将预处理数据作为csv保存到s3 bucket中的文件夹中_Python_Pandas_Amazon Web Services_Amazon S3_Aws Lambda - Fatal编程技术网

Python 无法将预处理数据作为csv保存到s3 bucket中的文件夹中

Python 无法将预处理数据作为csv保存到s3 bucket中的文件夹中,python,pandas,amazon-web-services,amazon-s3,aws-lambda,Python,Pandas,Amazon Web Services,Amazon S3,Aws Lambda,我的文件夹具有以下树结构: . ├── All_seasons_combined_script.py ├── Base_SLP │   ├── G0.xlsx │   ├── G1.xlsx │   ├── G2.xlsx │   ├── G3.xlsx │   ├── G4.xlsx │   ├── G5.xlsx │   ├── G6.xlsx │   ├── H0.xlsx │   ├── L0.xlsx │   ├── L1.xlsx │   └── L2.xlsx ├── Pipfil

我的文件夹具有以下树结构:

.
├── All_seasons_combined_script.py
├── Base_SLP
│   ├── G0.xlsx
│   ├── G1.xlsx
│   ├── G2.xlsx
│   ├── G3.xlsx
│   ├── G4.xlsx
│   ├── G5.xlsx
│   ├── G6.xlsx
│   ├── H0.xlsx
│   ├── L0.xlsx
│   ├── L1.xlsx
│   └── L2.xlsx
├── Pipfile
├── Pipfile.lock
├── README.md
├── requirements.txt
└── slp_handler.py
我在
slp\u handler.py
中有以下代码:

def yearly_slp_handler(event, context):
    try:
        COUNTRY = event['country']
        currentYear = datetime.datetime.now().strftime("%Y")
        HOLIDAYS = get_holidays(currentYear, COUNTRY)

        excel_path = os.path.join(Path(), "Base_SLP")
        print(excel_path)
        os.chdir(excel_path)

        absolute_path = Path(os.path.abspath(
            os.path.dirname('Base_SLP'))).parent
        print(absolute_path)

        EXCEL_FILES = glob.glob('*.xlsx')
        print(EXCEL_FILES)

        for file in EXCEL_FILES:
            time_series_df = season_df(file, HOLIDAYS)
            save_name = file.split('.')[0] + '_' + \
                currentYear + '_timeseries.csv'

            time_series_df.to_csv(save_name, index=None)

            s3 = boto3.resource('s3')
            bucket_name = 'mybucket/folder'
            s3.meta.client.upload_file(
                Filename=save_name, Bucket=bucket_name, Key=save_name)

            print('CSV dropped in the bucket folder.')

        return {'Status': 200}

    except Exception as e:
        print(e)
        return {'Status': 400}
其中
get_holidays
seasure_df
是我用于预处理数据的两个函数

我想做的是读取
Base\u SLP
文件夹中的所有
excel
文件,对每个文件进行预处理,并使用
to\u csv
将其保存为s3 bucket中的文件夹中的
csv

当我将代码部署为
lambda
并对其进行测试时,会出现以下错误:

START RequestId: xxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxx Version: $LATEST
./Base_SLP
/var/task
['G0.xlsx', 'G1.xlsx', 'G2.xlsx', 'G3.xlsx', 'G4.xlsx', 'G5.xlsx', 'G6.xlsx', 'H0.xlsx', 'L0.xlsx', 'L1.xlsx', 'L2.xlsx']
[Errno 30] Read-only file system: 'G0_2020_timeseries.csv'
Failed to upload /tmp/G0_2020_timeseries.csv to mybucket/folder/G0_2020_timeseries.csv: An error occurred (NoSuchBucket) when calling the PutObject operation: The specified bucket does not exist
我希望将预处理的文件转换为
csv
,然后必须将该
csv
放入s3存储桶中的文件夹中。我试过了onur,但仍然不起作用

我还尝试将
csv
保存在
/tmp/
文件夹中,并使用以下方法将其上传到s3中的文件夹:

但它抛出了以下错误:

START RequestId: xxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxx Version: $LATEST
./Base_SLP
/var/task
['G0.xlsx', 'G1.xlsx', 'G2.xlsx', 'G3.xlsx', 'G4.xlsx', 'G5.xlsx', 'G6.xlsx', 'H0.xlsx', 'L0.xlsx', 'L1.xlsx', 'L2.xlsx']
[Errno 30] Read-only file system: 'G0_2020_timeseries.csv'
Failed to upload /tmp/G0_2020_timeseries.csv to mybucket/folder/G0_2020_timeseries.csv: An error occurred (NoSuchBucket) when calling the PutObject operation: The specified bucket does not exist
bucket和文件夹存在并具有公共访问权限。但是,它仍然抛出了这个错误

我的
lambda
附带了
AmazonS3FullAccess
访问权限


我所犯的错误是什么?

您似乎试图将文件保存在
/var/task
中。在lambda环境中,只有
/tmp
可写入函数

因此,您可以尝试以下操作:

            save_name = '/tmp/' + file.split('.')[0] + '_' + \
                currentYear + '_timeseries.csv'

嘿@Marcin,谢谢你的帮助。我在方法1中尝试了您的建议,现在它抛出了以下错误:
参数验证失败:无效的bucket名称“mybucket/folder”:bucket名称必须与regex“^[a-zA-Z0-9.\-{1255}$”匹配,或者是与regex“^ARN:(aws)。*:s3:[a-z \-0-9]+:[0-9]{12}:accesspoint[/:][a-zA-Z0-9\-]{1,63}$”
@Junkrat Hi。bucket名称应为“mybucket”,不带“/文件夹”。如果要将文件放在某个文件夹中,这应该是保存密钥名的一部分。例如
s3.Object('mybucket','folder/')。上传文件('/tmp/'+保存名称)