【问题标题】:Load CSV file into Pandas from s3 using chunksize使用 chunksize 从 s3 将 CSV 文件加载到 Pandas
【发布时间】:2021-02-25 19:39:46
【问题描述】:

我正在尝试使用...从 s3 读取一个非常大的文件

import pandas as pd
import s3fs
df = pd.read_csv('s3://bucket-name/filename', chunksize=100000)

但即使在给出块大小之后,它也会永远占用。从 s3 获取文件时,chunksize 选项是否有效?如果没有,有没有更好的方法从 s3 加载大文件?

【问题讨论】:

  • this 有帮助吗?
  • 是的。认为 Dask 是一个不错的选择

标签: python pandas amazon-s3 python-s3fs


【解决方案1】:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html 说的很清楚

filepath_or_bufferstr,路径对象或类文件对象 任何有效 字符串路径是可以接受的。该字符串可以是一个 URL。有效网址 方案包括 http、ftp、s3、gs 和文件。对于文件 URL,主机是 预期的。本地文件可以是:file://localhost/path/to/table.csv。

如果你想传入一个路径对象,pandas 接受任何 os.PathLike。

通过类文件对象,我们指的是具有 read() 方法的对象,例如 文件句柄(例如通过内置的 open 函数)或 StringIO。

读取块时,pandas 会返回迭代器对象,你需要遍历它。 比如:

for df in pd.read_csv('s3://<<bucket-name>>/<<filename>>',chunksize = 100000):
    process df chunk..

如果你认为是因为 chunksize 很大,你可以考虑只为第一个 chunk 尝试这样的小块:

for df in pd.read_csv('s3://<<bucket-name>>/<<filename>>',chunksize = 1000):
    print(df.head())
    break

【讨论】:

  • 这个答案对我有帮助。我编写了一个函数,据此我知道 Athena 结果 S3 位置为存储桶和密钥。然后我按块处理大量的 Athena 结果 csv:def process_result_s3_chunks(bucket, key, chunksize): csv_obj = s3.get_object(Bucket=bucket, Key=key) body = csv_obj['Body'] for df in pd.read_csv(body, chunksize=chunksize): process(df)
猜你喜欢
  • 1970-01-01
  • 2016-06-07
  • 2021-11-22
  • 2019-01-31
  • 2018-07-22
  • 2022-01-14
  • 2018-10-29
  • 2018-06-25
  • 2017-06-15
相关资源
最近更新 更多