【问题标题】:read a zipped csv from S3 into python dataframe将压缩后的 csv 从 S3 读入 python 数据帧
【发布时间】:2020-09-01 15:47:06
【问题描述】:

我在 S3 中有一个存储桶,其中包含一个 csv。
其中没有非 ASCII 字符。
当我尝试使用 python 阅读它时,它不会让我。
我用过:df = self.s3_input_bucket.get_file_contents_from_s3(path)
正如我最近在同一个脚本中多次使用的那样,并得到: UnicodeDecodeError: 'utf8' codec can't decode byte 0x84 in position 14: invalid start byte.
为了确保它进入正确的路径,我将另一个纯文本文件放在同一个文件夹中,并且能够毫无问题地读取它。

我尝试了许多在其他问题上找到的解决方案。只是一个例子,我看到有人提供了一个解决方案,可以试试这个:

str = unicode(str, errors='replace')

str = unicode(str, errors='ignore')
来自这个问题:UnicodeDecodeError: 'utf8' codec can't decode byte 0x9c
但在这种情况下我该如何使用它们?
这不起作用:

str = unicode(self.s3_input_bucket.get_file_contents_from_s3(path), errors='replace')

【问题讨论】:

  • 文件未使用 UTF-8 编码。您需要告诉 S3 库使用不同的编解码器。你用的是哪个库?在 PyPI 上搜索“AWS S3”会返回多个匹配项。
  • 这是 CSV 格式的众多弱点之一。与所有文本文件一样,您必须使用编写它的字符编码来阅读它。如果您不知道它是哪个,则说明通信失败。你能问作者或参考文档或查看 HTTP 标头,...?

标签: python amazon-s3 utf-8


【解决方案1】:

问题中的错误消息实际上与 CSV 编码问题有关(与标题完全不同:“从 s3 读取压缩的 CSV”)。

title 问题的一个可能解决方案是:

pd.read_csv('s3://bucket-name/path/to/zip/my_file.zip')

Pandas 将打开 zip 并读取 CSV。这仅适用于 zip 包含单个 CSV 文件的情况。如果有多个,则需要另一种解决方案(可能更像 OP 的解决方案)。

可以通过在读取中指定编码类型来解决编码问题。例如:

pd.read_csv('s3://bucket-name/path/to/zip/my_file.zip', encoding = "ISO-8859-1")

【讨论】:

    【解决方案2】:

    显然,我试图打开一个压缩文件。
    经过大量研究,我能够使用以下代码将其读入数据框:

    import zipfile
    import s3fs
    s3_fs = s3fs.S3FileSystem(s3_additional_kwargs={'ServerSideEncryption': 'AES256'})
    
    market_score = self._zipped_csv_from_s3_to_df(os.path.join(my-bucket, path-in-bucket), s3_fs)
    
    def _zipped_csv_from_s3_to_df(self, path, s3_fs):
        with s3_fs.open(path) as zipped_dir:
                with zipfile.ZipFile(zipped_dir, mode='r') as zipped_content:
                    for score_file in zipped_content.namelist():
                        with zipped_content.open(score_file) as scores:
                            return pd.read_csv(scores)
    

    我在 zip 中总是只有一个 csv 文件,所以这就是为什么我知道我可以在第一次迭代时返回。
    但是这个函数会迭代 zip 中的文件。

    【讨论】:

      猜你喜欢
      • 2021-07-11
      • 2017-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多