【问题标题】:S3 appending random string in file nameS3在文件名中附加随机字符串
【发布时间】:2022-04-22 17:11:26
【问题描述】:

我有一个 s3 文件夹,其中存储了一个 csv 文件。我正在尝试下载最后修改的文件。我正在使用这个脚本来获取最后修改的文件:

s3_client = boto3.client('s3', aws_access_key_id=s3_extra_data['aws_access_key_id'],                               
aws_secret_access_key=s3_extra_data['aws_secret_access_key'])
response = s3_client.list_objects_v2(Bucket='test', Prefix='file_r/')
all = response['Contents']
latest = max(all, key=lambda x: x['LastModified'])
response = s3_client.list_objects_v2(Bucket='test', Prefix=latest["Key"])[:-52].lower())
all = response['Contents']
latest = max(all, key=lambda x: x['LastModified'])
print("LATEST ->" + str(latest["Key"])[:-52].lower())
print("PATH ->" + str(latest["Key"]))
s3_client.download_file("test", latest["Key"], str(latest["Key"]))

这段代码列出了我最后修改的对象,文件名为part-00000-40f267f2-38dc-4bab-811c-4c3052fdb1ba-c000.csv,位于file_r文件夹内。

虽然,当我使用s3_client.download_file 时,我收到以下错误:

'file_r/part-00000-40f267f2-38dc-4bab-811c-4c3052fdb1ba-c000.csv.8cEebaeb'

当我打印我的路径和文件时,我得到了正确的值

 LATEST -> file_r/part
 PATH -> file_r/part-00000-40f267f2-38dc-4bab-811c-4c3052fdb1ba-c000.csv

为什么在.csv 扩展后附加值.8cEebaeb,因为PATH 是正确的。

对此有什么想法吗?

【问题讨论】:

  • 当您打印 LATEST 时,您实际上并没有打印整个值;您正在打印 str(latest["Key"])[:-52].lower(),它会跳过最后 52 个字符。尝试打印整个值,以便准确查看字符串包含的内容。
  • 另外,path 是在哪里定义的?
  • @JohnGordon 关于您的第一条评论,它会打印正确的值(最后不附加随机值)。关于您的第二条评论,PATH 是latest["Key"]。我已经编辑了这个问题来纠正这个问题。
  • 你得到什么错误?哪条线路不合格? boto3 会在下载时为文件添加一个随机后缀,然后在下载完成后重命名文件。
  • @AnonCoward 我解决了这个问题。我在下面发布答案。

标签: python amazon-web-services amazon-s3 boto3


【解决方案1】:

我在未创建本地文件夹时遇到了这个问题。

folder1/folder2/filename.foo

如果本地不存在folder1或folder2,则boto3返回错误:

FileNotFoundError: [Errno 2] No such file or directory: 'folder1/folder2/finemane.foo.F89bdcAc'

【讨论】:

    【解决方案2】:

    为了解决问题,我将代码更改为:

    s3_client = boto3.client('s3', aws_access_key_id=s3_extra_data['aws_access_key_id'],                               
    aws_secret_access_key=s3_extra_data['aws_secret_access_key'])
    response = s3_client.list_objects_v2(Bucket='test', Prefix='file_r/')
    all = response['Contents']
    latest = max(all, key=lambda x: x['LastModified'])
    s3_client.download_file("test", latest["Key"], "FILE_NAME"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2018-03-28
      • 2013-10-05
      相关资源
      最近更新 更多