【问题标题】:Bigquery to S3 File upload using Python: raise ValueError('Filename must be a string')Bigquery 使用 Python 上传到 S3 文件:raise ValueError('Filename must be a string')
【发布时间】:2020-06-08 02:35:52
【问题描述】:

我正在尝试从 BQ 中提取数据并将其保存为 CSV,然后将其上传到 s3,但上传到 s3 时出现错误。这是我运行脚本时遇到的错误:

raise ValueError('Filename must be a string')

如果你能帮我解决这个问题,我是 Python 和 AWS 的新手。谢谢

脚本是:



    rows_df = query_job.result().to_dataframe() 
    file_csv = rows_df.to_csv(s3_filename, sep='|', index=False, encoding='utf-8')
    s3.upload_file(file_csv, s3_bucket, file_csv)


【问题讨论】:

    标签: python amazon-s3 google-bigquery


    【解决方案1】:

    尝试更改传递给s3.upload_file 的参数,如下所示:

    s3.upload_file(s3_filename, s3_bucket, s3_filename)
    

    to_csv 将数据帧写入路径 s3_filename 的本地文件,而 file_csvNone。或者,如果您的数据框足够小以保存在内存中,则以下内容应该可以解决问题:

    import io
    data = rows_df.to_csv(sep='|', index=False, encoding='utf-8')
    data_buffer = io.BytesIO(data)
    s3.upload_fileobj(data_buffer, s3_bucket, s3_filename)
    

    【讨论】:

    • upload_file 和upload_fileobj 有什么区别?我尝试按照您的建议运行脚本,它返回错误 ValueError: Fileobj must implement read.
    • 这是对stackoverflow.com/questions/52336902/… 的答案我已经更新了第二个代码示例,data_buffer 现在是 upload_fileobj 接受的类似文件的对象。
    【解决方案2】:

    基于 pandas doc,当指定 path_or_buf 时,to_csv 返回 None。但是,upload_file 在其第一个和第三个参数中分别需要一个文件名和一个 S3 密钥。因此,这样的事情可以使这项工作。

    s3.upload_file(s3_filename, s3_bucket, s3_filename)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 2021-06-25
      相关资源
      最近更新 更多