【问题标题】:How to load xls file from an Amazon S3 bucket and convert to xlsx and save to Amazon S3如何从 Amazon S3 存储桶加载 xls 文件并转换为 xlsx 并保存到 Amazon S3
【发布时间】:2021-08-30 15:04:38
【问题描述】:

我正在尝试加载 xls 文件并从 Amazon S3 存储桶转换为 xlsx。

如果有人知道该怎么做,真的很感激:

  1. 从 s3 读取 xls 文件
  2. 将 xls 转换为 xlsx 并保存在 s3 中。

约束: 1.这是一个企业项目,因此无法将文件下载到我的本地并转换和重新上传 2. 我们的内部应用程序运行在 EC2 linux 上,因此无法安装适用于 windows 的软件包,如 win32.client 进行转换。

谢谢!!

【问题讨论】:

  • 你为什么要在workbook = xlrd.open_workbook(s3_client)中打开s3_client? ;)
  • 谢谢@droebi,我没有如何做到这一点的经验。你能提供一些关于如何打开 s3 xls 文件的建议吗?什么应该是正确的工具?谢谢!
  • 传入您从 S3 读取的 binary_data,而不是 S3 客户端 s3_client 本身。
  • 谢谢@AnonCoward,我尝试放入 binary_data 但收到错误抱怨 [Errno 36] File name too long: b' 我认为它正在将整个文件作为文件名

标签: python excel amazon-web-services amazon-s3 xls


【解决方案1】:

尝试以下操作: 当您在 AWS 中运行它时: Python: How to read and load an excel file from AWS S3?

当你在本地运行时:

  1. 下载此文件:
  1. 将 xls 转换为 xlsx:

     def xls_to_xlsx(*args, **kw):
         book_xls = xlrd.open_workbook(*args, formatting_info=True, ragged_rows=True, **kw)
         book_xlsx = openpyxl.workbook.Workbook()
    
         sheet_names = book_xls.sheet_names()
         for sheet_index in range(len(sheet_names)):
             sheet_xls = book_xls.sheet_by_name(sheet_names[sheet_index])
             if sheet_index == 0:
                 sheet_xlsx = book_xlsx.active
                 sheet_xlsx.title = sheet_names[sheet_index]
             else:
                 sheet_xlsx = book_xlsx.create_sheet(title=sheet_names[sheet_index])
             for crange in sheet_xls.merged_cells:
                 rlo, rhi, clo, chi = crange
                 sheet_xlsx.merge_cells(start_row=rlo + 1, end_row=rhi,
                                        start_column=clo + 1, end_column=chi, )
    
             def _get_xlrd_cell_value(cell):
                 value = cell.value
                 if cell.ctype == xlrd.XL_CELL_DATE:
                     if value == 1.0:
                         datetime_tup = (0, 0, 0)
                     else:
                         datetime_tup = xlrd.xldate_as_tuple(value, 0)
    
                     if datetime_tup[0:3] == (0, 0, 0):
                         value = datetime.time(*datetime_tup[3:])
                     else:
                         value = datetime.datetime(*datetime_tup)
                 return value
    
             for row in range(sheet_xls.nrows):
                 sheet_xlsx.append((
                     _get_xlrd_cell_value(cell)
                     for cell in sheet_xls.row_slice(row, end_colx=sheet_xls.row_len(row))
                 ))
    
         return book_xlsx
    
  2. 将其上传回 S3:

【讨论】:

  • AWS没有转换文件类型的内部函数吗?
  • 谢谢 Droebi,我受限的一个问题是我们在 EC2 实例上运行程序,这是企业项目,我认为很难回到我的本地并重新上传。
  • 我编辑了我的答案,也许第一个链接对你有帮助,如果没有发表评论,我会尽力帮助你解决这个问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2012-11-02
  • 2016-08-25
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 2013-12-21
相关资源
最近更新 更多