Чтение нескольких файлов CSV из каталога для проверки количества столбцов

#python

#python

Вопрос:

У меня есть каталог «D:sta_timesdataGen21data_generationcsv_data » где у меня есть 24 папки, а именно. ‘Apr2018’, ‘Apr2019’, ‘Aug2018’, ‘Aug2019’, ‘Dec2018’, ‘Dec2019’, ‘Feb2019’, ‘Feb2020’, ‘Jan2019’, ‘Jan2020’, ‘Jul2018’, ‘Jul2019’, ‘Jun2018’, ‘Jun2019’, ‘Mar2019′,’Mar2020’, ‘May2018’, ‘May2019’, ‘Nov2018’, ‘Nov2019’, ‘Oct2018’, ‘Oct2019’, ‘Sept2018’, ‘Sept2019’.

И у меня также есть несколько файлов csv в каждой папке.

 Eg: In 'Apr2018' there are 'Gen21_et_now.csv','Gen21_mirror_now.csv','Gen21_mnx.csv',
 'Gen21_mnx_hd.csv','Gen21_mn_plus.csv','Gen21_movies_now.csv','Gen21_movies_now_hd.csv',
'Gen21_romedy_now.csv','Gen21_romedy_now_hd.csv','Gen21_times_now.csv','Gen21_times_now_uk.csv',
 'Gen21_times_now_usa.csv','Gen21_times_now_world.csv','Gen21_zoom.csv','Gen21_zoom_usa.csv'
  

В папке ‘Apr2018’ 15 файлов.

Я хочу прочитать каждый файл csv из каждой папки и хочу проверить номер столбца каждого фрейма данных.

Я хочу создать словарь

 {'Apr2018': {'Gen21_et_now': 69,
  'Gen21_mirror_now': 69,
  'Gen21_mnx': 68,
  'Gen21_mnx_hd': 68,
  'Gen21_mn_plus': 68,
  'Gen21_movies_now': 68,
  'Gen21_movies_now_hd': 68,...
 'Apr2019': {'Gen21_et_now': 69,
  'Gen21_mirror_now': 69,
  'Gen21_mnx': 68,...} 
  

Где ‘Apr2018’ — это папка, а ‘Gen21_et_now’ — это файл, а 69 — количество присутствующих столбцов.

Мой код

 import os
import pandas as pd
os.chdir(os.getcwd() '\csv_data')
month = {}
chnl_col = {}
for folder in range(len(os.listdir())):
    for file in range(len(os.listdir()[folder])):
        mydf=pd.read_csv(os.getcwd() '\' os.listdir()[folder] '\' os.listdir(os.listdir()[folder])[file])
        ch_data=os.listdir(os.listdir()[folder])[file].split('.')[0]
        chnl_col[ch_data]=len(mydf.columns)
    month[os.listdir()[folder]]=chnl_col
    chnl_col={}

  

После выполнения кода считываются только 7 файлов из 15 файлов. и результат

 {'Apr2018': {'Gen21_et_now': 69,
  'Gen21_mirror_now': 69,
  'Gen21_mnx': 68,
  'Gen21_mnx_hd': 68,
  'Gen21_mn_plus': 68,
  'Gen21_movies_now': 68,
  'Gen21_movies_now_hd': 68},...}
  

Любая помощь в этом??

Комментарии:

1. Последняя часть этой строки выглядит некорректно: mydf=pd.read_csv(os.getcwd() '\' os.listdir()[folder] '\' os.listdir(os.listdir()[folder])[file])

2. Попробуйте использовать pathlib , сделает ваш код более читаемым

3. @archer Если бы эта строка была неправильной, то мой словарь не был бы создан для одного файла csv. Не могли бы вы указать неправильную часть упомянутого кода?

Ответ №1:

Проблема с вашим кодом находится в строке for file in range(len(os.listdir()[folder])): , потому os.listdir()[folder] что это имя папки (a str), а не список файлов внутри самой папки. So len(os.listdir()[folder]) дает вам количество букв, которые у вас есть в названии вашего каталога. Вам нужно изменить свой код таким образом :

 import os
import pandas as pd
os.chdir(os.getcwd() '\csv_data')
month = {}
chnl_col = {}
for folder in range(len(os.listdir())):
    for file in range(len(os.listdir(path=os.getcwd() '\' os.listdir()[folder]))):
        mydf=pd.read_csv(os.getcwd() '\' os.listdir()[folder] '\' os.listdir(os.listdir()[folder])[file])
        ch_data=os.listdir(os.listdir()[folder])[file].split('.')[0]
        chnl_col[ch_data]=len(mydf.columns)
    month[os.listdir()[folder]]=chnl_col
    chnl_col={}
  

Я думаю, что было бы хорошо улучшить название ваших переменных: с именами folder , и file мы считаем, что вы манипулируете объектами или именами объектов, но на самом деле вы манипулируете индексами.

Комментарии:

1. Вам также, вероятно, следует просто избегать зацикливания на индексах. Вместо этого сделайте, например for folder in os.listdir()