簡體   English   中英

Python 3:如何將 AWS S3 中的多個 CSV 加載到 Pandas dataframe 中?

[英]Python 3: How to load multiple CSVs in AWS S3 into a Pandas dataframe?

我正在處理連接到 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 文件中的每一個手動執行顯然很難/效率低下。

關於其他嘗試或如何調試的任何想法?

如果您在所有.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后可以將第一行指定為列名。

暫無
暫無

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

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