用Python遍历文件夹下的所有文件并进行数据处理(Pathlib简介)

  • A+
所属分类:Python

数据分析的日常工作中,我们可能会经常需要处理这样的问题:将一个或多个文件夹下的文件中的数据进行分析、处理、整合。这些文件通常是相似的或是同类别的,比如我们有多个月份的销售信息,每个月份的数据分别存在一个excel文档中;多个类别的销售信息,每个类的数据分别存在一个excel文档中等等。像是如图中所示:

在当前文件夹中存在“files”文件夹,里面是我们将要分析的数据,在该文件夹目录下又有如下四个文件夹,我们可以看作是四个大类的数据:

这四个文件夹当中就分别存放着所对应的数据,随便打开其中一个文件夹,数据文件如图所示:

 其中每个文件的内容大致是相同:

所有文件共有128个,每个文件中条目数在几百行,我们需要分别对这些文件中的数据进行分析,求出每个文件中所属类目起始日期、终止日期、平均转化率、平均客单价,然后汇总到一起输出一份数据分析报告。如果用excel来一个个处理的话需要处理128次,想想就觉得费力啊!那么这个时候用上我们的pandas就再合适不过了。这个时候有些朋友会有些疑惑,我们该如何遍历这些文件并读取数据呢?本文就通过os库以及pathlib库为大家讲解,并在最后重点介绍一下pathlib。

首先导入我们需要使用到的库:

设置自己存放文件的根目录:

file_path = "/Users/***/jupyter_notebook/Python_file_processing/files"

先用os的方法,这里我们使用os.walk()来遍历文件名:

可以看到每次遍历都包含当前文件夹的根路径该文件夹下的文件夹该文件夹下的所有文件列表。通过代码我们可以轻松地将所有文件名整理到一个列表中:

  1. for iroot, idirs, ifiles in os.walk(file_path):

  2. ifiles.remove('.DS_Store')

  3. file_list.extend(ifiles)

  4. file_dict[iroot] = ifiles

因为pandas读取文件需要绝对路径,所以我们建立一个根路径与文件名对应的字典,之后拼凑成绝对路径。file_dict如下图所示:

这样我们就可以通过dict.items()来拼接文件的绝对路径了,然后遍历读取文件,分析我们所需要的指标:

  1. for k, v in file_dict.items():

  2. file_name = os.path.join(k, i)

  3. file = pd.read_excel(file_name)

  4. start_time.append(file['日期'].min())

  5. end_time.append(file['日期'].max())

  6. conversion_mean.append(file['转化率'].mean())

  7. category.append(file['三级类目'].unique()[0])

  8. unit_price_mean.append(file['客单价'].replace(np.inf, np.nan).dropna().mean())

  9. output_file = pd.DataFrame({'起始日期': start_time,

  10. '终止日期': end_time,

  11. '平均转换率': conversion_mean,

  12. '所属类目': category,

  13. '平均客单价': unit_price_mean})

  14. cost = round(time.time() - start, 2)

最后输出分析报告,共128个条目:

接下来我们用pathlib来遍历文件,可能比os要方便一些。

首先设置文件目录:

p = Path(file_path)

让我们看一下通过pathlib的方法是如何遍历的:

  1. for file in p.rglob('*.xlsx'):

可以看到,通过pathlib.Path.rglob()方法可以直接遍历汇总所有文件的绝对路径,直接用pandas读取即可:

  1. for file_name in p.rglob('*.xlsx'):

  2. file = pd.read_excel(file_name)

  3. start_time.append(file['日期'].min())

  4. end_time.append(file['日期'].max())

  5. conversion_mean.append(file['转化率'].mean())

  6. category.append(file['三级类目'].unique()[0])

  7. unit_price_mean.append(file['客单价'].replace(np.inf, np.nan).dropna().mean())

  8. output_file1 = pd.DataFrame({'起始日期': start_time,

  9. '终止日期': end_time,

  10. '平均转换率': conversion_mean,

  11. '所属类目': category,

  12. '平均客单价': unit_price_mean})

  13. cost = round(time.time() - start, 2)

这样,通过pandas的方法我们一下子就处理完了所有数据,只用时2秒,和手动用excel一个个处理相比太方便了,而pathlib库的使用更加方便了我们代码的编写。

Pathlib简介:

得到当前目录:

p = Path.cwd()

拼接路径,得到想要的文件的绝对路径:

p_new = p.joinpath('files', 'files32_1', '户外服装&潜水服.xlsx')

得到路径文件:

p_new.name

得到路径文件的名称:

p_new.stem

得到路径文件的后缀:

p_new.suffix

得到路径文件的上一级目录:

p_new.parent

得到路径的每一级:

p_new.parts

判断路径文件是否存在:

p_new.exists()

判断路径文件是否为文件夹:

p_new.is_dir()

判断路径文件是否为文件:

p_new.is_file()

创建新文件夹:

  1. p_dir = Path(Path.cwd().joinpath('created_dir'))

  2. # True--若p_dir不存在则递归创建文件夹

  3. p_dir.mkdir(exist_ok=True, parents=True)

创建文件夹之前:

创建文件夹之后: 

修改路径文件的文件后缀(with_shuffix修改后缀,with_name修改文件名):

  1. p_new.replace(p_new.with_suffix('.txt'))

删除路径文件:

p_new.unlink()

感谢观看!

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin