簡體   English   中英

從 S3 讀取一個壓縮的 csv 到 python 數據幀

[英]read a zipped csv from S3 into python dataframe

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

顯然,我試圖打開一個壓縮文件。
經過大量研究,我能夠使用以下代碼將其讀入數據框:

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

問題中的錯誤消息實際上與 CSV 編碼問題有關(與標題完全不同:“從 s3 讀取壓縮的 CSV”)。

標題問題的一種可能解決方案是:

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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM