我在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')
答案 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文件中的文件。