чтение нескольких файлов, содержащих несколько CSV - PullRequest
0 голосов
/ 28 октября 2018

У меня есть данные о ежедневных продажах за 2 года, которые делятся на ежемесячные файлы.

У меня есть несколько папок, каждая папка содержит несколько CSV.Я хочу прочитать его на Python, используя pandas.

Я пробовал для 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 голосов
/ 09 ноября 2018

Я сделал макет из того, что вы описали, структура папок выглядит следующим образом:

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

Код ниже:

  • Создает pathlib.Path вашего входного каталога
  • Проверяет этот каталог и его подкаталоги для файлов с суффиксом .csv
  • Перебирает список .csv файлов, открывая их какpd.DataFrame
  • Этот список DataFrames затем объединяется в один 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...