从S3将压缩的csv读取到python数据帧中

时间:2019-02-03 07:48:56

标签: python amazon-s3 utf-8

我在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')

2 个答案:

答案 0 :(得分:1)

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

解决标题问题的一种可能方法是:

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

熊猫将打开zip并读取CSV。仅当zip包含单个CSV文件时,此方法才有效。如果有多个,则需要其他解决方案(可能更像OP的解决方案)。

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

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

答案 1 :(得分:0)

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

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文件中的文件。