读取包含多个csv的多个文件

时间:2018-10-28 13:38:33

标签: python-3.x pandas csv

我有2年的每日销售数据,分为月度文件。

我有多个文件夹,每个文件夹包含多个csv。 我想用熊猫在Python中阅读它。

我尝试了1个文件夹

    path =r'C:\DRO\DCL_rawdata_files' # use your path
allFiles = glob.glob(path + "/*.csv")
frame = pd.DataFrame()
list_ = []
for file_ in allFiles:
    df = pd.read_csv(file_,index_col=None, header=0)
    list_.append(df)
frame = pd.concat(list_)

但是如上所述,对于1个文件夹,同样明智的是,我对100个文件夹运行了相同的代码块100次。

使用它们的某种方法来减少每个文件夹的运行一次吗?

1 个答案:

答案 0 :(得分:0)

我已经对您所描述的内容进行了模拟,文件夹结构如下:

/test/so/
  1/
    a.csv
    b.csv
  2/
    c.csv
    d.csv
  3/
    e.csv
    f.csv

以下代码:

  • 创建输入目录的pathlib.Path
  • 检查此目录及其子目录中后缀为.csv的文件
  • 遍历.csv文件列表,将其打开为pd.DataFrame
  • 然后将这个DataFrame列表串联到一个DataFrame中

此方法的局限性在于它希望所有文件的格式相同。

import pandas as pd
from pathlib import Path

p = Path('/test/so/')

files = []
file_extensions = ['.csv']
for file_or_directory in p.iterdir():
    if file_or_directory.is_file() and ''.join(file_or_directory.suffixes).lower() in file_extensions:
        files.append(file_or_directory)
    elif file_or_directory.is_dir():
        files.extend([x for x in file_or_directory.iterdir() if ''.join(x.suffixes).lower() in file_extensions])
print(files)
[PosixPath('/test/so/1/a.csv'), PosixPath('/test/so/1/b.csv'),
 PosixPath('/test/so/2/c.csv'), PosixPath('/test/so/2/d.csv'),
 PosixPath('/test/so/3/e.csv'), PosixPath('/test/so/3/f.csv')]

df_list = []
for f in files:
    try:
        df_list.append(pd.read_csv(filepath_or_buffer=f))
    except pd.errors.ParserError as e:
        raise pd.errors.ParserError('Input file probably not expected format')
df = pd.concat(df_list, ignore_index=True)

print(df)
    0   1   2   3
0   a   b   c   d
1   e   f   g   h
2   i   j   k   l
3   m   n   o   p
4   q   r   s   t
5   u   v   w   x