首页 > 解决方案 > Python 3:如何将 AWS S3 中的多个 CSV 加载到 Pandas 数据框中?

问题描述

我正在处理连接到 EMR 集群的 AWS EMR Notebook。我通常习惯于在 Scala 中工作并将带有数千个 CSV 的 AWS S3 目录加载到 Spark DataFrame 中。但是,我无法使用 Python 3 模拟相同的方法。

我至少有一千个csv像这样的文件:

s3://dir/part-00000-d27fd1c5-96d0-431c-88d8-4b216fe008d5-c000.csv
s3://dir/part-00001-d27fd1c5-96d0-431c-88d8-4b216fe008d5-c000.csv
...
s3://dir/part-12345-...

我尝试了这三种方法中的每一种,每种方法都由一个新行分隔:

df = pd.concat(map(pd.read_csv, glob.glob('s3://dir/*.csv')))

df = pd.concat(map(pd.read_csv, glob.glob(os.path.join('', "s3://dir/*.csv"))))

path = r's3://dir'                     # use your path
all_files = glob.glob(os.path.join(path, "*.csv"))     # advisable to use os.path.join as this makes concatenation OS independent
df_from_each_file = (pd.read_csv(f) for f in all_files)
concatenated_df   = pd.concat(df_from_each_file, ignore_index=True)

每个都给出错误:ValueError: No objects to concatenate

故障排除提示

在最后一个解决方案的情况下,我注意到这all_files是一个空列表:

path = r's3://dir'                     # use your path
all_files = glob.glob(os.path.join(path, "*.csv"))     # advisable to use os.path.join as this makes concatenation OS independent
all_files
[]

另外,我试过:

os.listdir(path)
FileNotFoundError: [Errno 2] No such file or directory: 's3://dir'

当然,该目录存在,因为我可以在此 S3 目录中看到 CSV 文件。我也没有打错,因为我只是在复制粘贴。因此,这表明我可能无法从 EMR 集群中查看它。

请注意,我可以像这样加载单个 CSV:

df = pd.read_csv('s3://dir/part-00000-d27fd1c5-96d0-431c-88d8-4b216fe008d5-c000.csv')
df

但这对于我拥有的数千个 csv 文件中的每一个手动执行显然很难/效率低下。

关于其他尝试或如何调试的任何想法?

标签: python

解决方案


如果您在所有.CSV文件中都有相同的列,那么这可能只是适合您。

import pandas as pd
import glob

path = r'C:\DRO\DCL_rawdata_files' # use your path
all_files = glob.glob(path + "/*.csv")

li = []

for filename in all_files:
    df = pd.read_csv(filename, index_col=None, header=0)
    li.append(df)

frame = pd.concat(li, axis=0, ignore_index=True)

在这里,我添加了header=0以便在阅读.CSV第一行后可以将其指定为列名。


推荐阅读