首页 > 解决方案 > 从目录中读取多个 CSV 文件以检查列数

问题描述

我有一个目录“D:\sta_times\data\Gen21\data_generation\csv_data”,其中有 24 个文件夹。即。'Apr2018'、'Apr2019'、'Aug2018'、'Aug2019'、'Dec2018'、'Dec2019'、'Feb2019'、'Feb2020'、'Jan2019'、'Jan2020'、'Jul2018'、'Jul2019'、'Jun20' '、'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={}

执行代码后,15个文件中只有7个文件被读取。输出是

{'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},...}

对此有任何帮助吗?

标签: python

解决方案


您的代码存在问题,for file in range(len(os.listdir()[folder])):因为os.listdir()[folder]文件夹的名称(str)不是文件夹本身的文件列表。因此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={}

我认为改进变量的名称会很好:使用名称folderfile我们相信您操纵对象或对象名称,但实际上您操纵索引。


推荐阅读