我正在尝试读取具有相同结构(列名称)并位于多个文件夹中的多个CSV文件,我的主要目的是将这些文件连接到一个熊猫数据框中。请在下面找到附件文件夹的位置分布,因此每个文件夹包含5个CSV文件。是否有任何预定义的函数或smth可以帮助??
import os
import pandas as pd
outdir = [YOUR_INITIAL_PATH]
df_final = pd.DataFrame(columns=['column1', 'column2', 'columnN']) # creates an empty df with the desired structure
for root, dirs, filenames in os.walk(outdir):
for f in filenames:
if f.endswith('.csv'):
df_temp = pd.read_csv(root + '\\' + f)
df_final = pd.concat([df_final, df_temp])
您可以使用glob.glob('*.csv')
查找所有csvs然后将它们全部连接起来。
import glob
import pandas as pd
csv_paths = glob.glob('*.csv')
dfs = [pd.read_csv(path) for path in csv_paths]
df = pd.concat(dfs)
您可以使用os.walk()
迭代目录树(example)中的文件。 pd.read_csv()
会将单个文件读入数据帧。 pd.concat(df_list)
将连接df_list中的所有数据帧。
我不相信有一种方法可以将上述所有方法结合起来以方便您使用。
Frenzy Kiwi给了你正确的答案。另一种方法是使用dask
,假设你的文件夹结构是
data
├── 2016
│ ├── file01.csv
│ ├── file02.csv
│ └── file03.csv
├── 2017
│ ├── file01.csv
│ ├── file02.csv
│ └── file03.csv
└── 2018
├── file01.csv
├── file02.csv
然后你可以通过阅读所有这些
import dask.dataframe as dd
import pandas as pd
df = dd.read_csv("data/*/*.csv")
# convert to pandas via
df = df.compute()
这是解决此问题的最佳方法:
import os
import glob
import pandas as pd
def nested_files_to_df(path,ext):
paths = []
all_data = pd.DataFrame()
#--- Putting all files name in one list ---#
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith(tuple(ext)):
s = os.path.join(root, file)
paths.append(s)
#--- Reading and merging all the existing excel files into one dataframe ---#
for f in paths:
df = pd.read_excel(f)
all_data = all_data.append(df,ignore_index=True)
return all_data
调用函数:
df= nested_files_to_df('Your main folder root',[".xls",".XLS",".xlsx"])