#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()