使用pandas的.to_csv函数时出现了PermissionError错误。

3

我有这段代码,可以从S3读取.txt文件,并使用pandas将该文件转换为.csv:

file = pd.read_csv(f's3://{bucket_name}/{bucket_key}', sep=':', error_bad_lines=False)
file.to_csv(f's3://{bucket_name}/file_name.csv')

我已经给IAM角色提供了读写权限,但仍然在.to_csv函数中出现错误:
Anonymous access is forbidden for this operation: PermissionError

更新:EC2日志中的完整错误如下:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/s3fs/core.py", line 446, in _mkdir
    await self.s3.create_bucket(**params)
  File "/usr/local/lib/python3.6/dist-packages/aiobotocore/client.py", line 134, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the CreateBucket operation: Anonymous access is forbidden for this operation

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "convert_file_instance.py", line 92, in <module>
    main()
  File "convert_file_instance.py", line 36, in main
    raise e
  File "convert_file_instance.py", line 30, in main
    file.to_csv(f's3://{bucket_name}/file_name.csv')
  File "/usr/local/lib/python3.6/dist-packages/pandas/core/generic.py", line 3165, in to_csv
    decimal=decimal,
  File "/usr/local/lib/python3.6/dist-packages/pandas/io/formats/csvs.py", line 67, in __init__
    path_or_buf, encoding=encoding, compression=compression, mode=mode
  File "/usr/local/lib/python3.6/dist-packages/pandas/io/common.py", line 233, in get_filepath_or_buffer
    filepath_or_buffer, mode=mode or "rb", **(storage_options or {})
  File "/usr/local/lib/python3.6/dist-packages/fsspec/core.py", line 399, in open
    **kwargs
  File "/usr/local/lib/python3.6/dist-packages/fsspec/core.py", line 254, in open_files
    [fs.makedirs(parent, exist_ok=True) for parent in parents]
  File "/usr/local/lib/python3.6/dist-packages/fsspec/core.py", line 254, in <listcomp>
    [fs.makedirs(parent, exist_ok=True) for parent in parents]
  File "/usr/local/lib/python3.6/dist-packages/s3fs/core.py", line 460, in makedirs
    self.mkdir(path, create_parents=True)
  File "/usr/local/lib/python3.6/dist-packages/fsspec/asyn.py", line 100, in wrapper
    return maybe_sync(func, self, *args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/fsspec/asyn.py", line 80, in maybe_sync
    return sync(loop, func, *args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/fsspec/asyn.py", line 51, in sync
    raise exc.with_traceback(tb)
  File "/usr/local/lib/python3.6/dist-packages/fsspec/asyn.py", line 35, in f
    result[0] = await future
  File "/usr/local/lib/python3.6/dist-packages/s3fs/core.py", line 450, in _mkdir
    raise translate_boto_error(e) from e
PermissionError: Anonymous access is forbidden for this operation

我不知道为什么它要创建存储桶?而且我已经给 Lambda 角色提供了 S3 的完全访问权限。

请问有人能告诉我我错过了什么吗?

谢谢。


解决来自Amazon S3的"Access Denied"错误。请参考:https://aws.amazon.com/premiumsupport/knowledge-center/s3-troubleshoot-403/ - sushanth
写入权限已提供,在同一程序中,我可以使用boto3客户端的简单复制功能将文件放置在同一个存储桶中。 - dar
使用Lambda函数,如果我可以使用boto3将文件复制到同一个存储桶中,为什么我不能使用pandas的to_csv函数? - dar
你是在哪里运行boto3的?你是否为用于运行boto3脚本的用户/角色授予了S3存储桶权限? - Prabhakar Reddy
在同一个 Lambda 函数中,我正在使用 boto3 将文件从一个 S3 复制到另一个 S3,它正常工作。但是,在同一个 Lambda 中,当我执行上面的代码时,它会给我返回这个错误,所以我不认为 IAM 或用户角色的权限有任何问题。 - dar
显示剩余4条评论
2个回答

4

我认为这是pandas、boto3和s3fs库之间不兼容的原因。

请尝试这个设置:

pandas==1.0.3

boto3==1.13.11

s3fs==0.4.2

我也尝试过使用pandas版本1.1.1,它也可以正常工作(我在Python 3.7中使用)


问题出在boto3版本上,通过以上设置错误已解决,感谢您的帮助。 - dar
这是一件令人愉快的事情。 - David

0

我在使用新版本的pandas时遇到了类似的问题,但是通过以下版本组合解决了:

pandas==1.5.2
s3fs==2022.11.0

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