前言

我们在数据读取和处理的时候,常常会遇到很不规整的数据,需要我们自己去写脚本或者程序去批量处理,这个工作是很常见的,并且对于遍历的时候如何正确运用os、open、pandas、re等都是十分重要的,对于我们的数据主要分为.csv .txt等等,对于其他很多类型比如DAT其实和.csv的读取相似,都是用pandas去读取较为方便处理,而对于可以用Notepad++来打开的文本文件,一般来说pandas处理较为不方便或者不能处理,一般都是用open来打开进行遍历每一行进行处理的,这里我对处理这些文件做一个小小的总结和总体写的框架的分享。

一、文件的组成

这边demo我设计为差不多四层,如下图所示,不在赘述

读取resouce文件夹下的子文件夹_数据


这边我使用jupyter lab去编写.ipynb的程序,位置关系如下:

读取resouce文件夹下的子文件夹_取文本_02

二、读取文件夹名称

首先我们需要先利用os读取每个最底层文件夹名称

这里都是基本的代码写法,我不想做过多说明,自行捋一下肯定都明白了。

读取resouce文件夹下的子文件夹_取文本_03


之后我们获取每个底层文件夹中的所有文件,也就是说我们要处理这些文件我们需要得到 这些所有最终文件的相对路径。

这边的做法就是再来一次一样的操作进行循环遍历即可获得,如下:

读取resouce文件夹下的子文件夹_数据_04


步骤如下:

  1. os.listdir得到这个路径文件夹下一层的所有文件名,并组成list
  2. 通过这个list进行每个文件夹名遍历,并利用os.path.join形成对应于上一层的绝对路径
  3. 利用这个思维可以嵌套出下下层的所有文件路径

三、读取文本内容

3.1 读文本内容

很多很不常见的格式比如.000等文本格式,其实都是可以用Notepad++打开,基本上都是用open来读取

文件为

读取resouce文件夹下的子文件夹_读取resouce文件夹下的子文件夹_05


代码如下:

读取resouce文件夹下的子文件夹_读取resouce文件夹下的子文件夹_06


可见空行依然会读出来, 我这里设置i的作用就是让大家一下子明白for循环的那句的具体作用是读取文本中的每一行内容。

3.2 内容解析

首先看看读取的是什么类型的。

读取resouce文件夹下的子文件夹_取文本_07


读取的都是string类型。

读取resouce文件夹下的子文件夹_数据_08


取出来之后一般都尝试着把所有的数据整理到一起输出.csv文件或者.h5文件,这里为了让大家看到更直观,我们生成.csv,主要思路就是创建一个空的dataframe,之后把每一个line的数据进行插入,当然在插入之前需要最好确定下columns和每一个插入的数据的具体类型。

这里除了第二列都是int型。

读取resouce文件夹下的子文件夹_读取resouce文件夹下的子文件夹_09

3.3 输出文件

读取resouce文件夹下的子文件夹_读取resouce文件夹下的子文件夹_10


读取resouce文件夹下的子文件夹_读取resouce文件夹下的子文件夹_11


打开如下:

读取resouce文件夹下的子文件夹_绝对路径_12

四、总体完整程序

import pandas as pd
import numpy as np
import os


total_folder_path = 'ccc_123456'

total_folder_list = os.listdir(total_folder_path)

columns_name = ['a', 'b', 'c', 'd']  # columns_name
final_data =pd.DataFrame(columns=columns_name) # 空DataFrame

for total_folder in total_folder_list:
    new_total_folder_path = os.path.join(total_folder_path, total_folder)
    
    folder_list = os.listdir(new_total_folder_path)
    for folder in folder_list:
        new_folder_path = os.path.join(new_total_folder_path, folder)
        Single_file_name = new_folder_path
        
        with open(Single_file_name) as f:
            for line in f.readlines():

                data = line.strip() # 删掉前后所有空格
                data = data.split() # 用空格分分割数据
                if data == []: #如果是空行不需要操作之后进下一行
                    continue
                # 空df中插入一行
                final_data=final_data.append(
                    pd.DataFrame({'a':[np.int(data[0])], 'b':[np.float(data[1])],
                                  'c':[np.int(data[2])], 'd':[np.int(data[3])],}),ignore_index=True)
print(final_data.head())
final_data.to_csv('demo_final.csv',index=None)#把index隐藏,columns保留

读取resouce文件夹下的子文件夹_绝对路径_13


读取resouce文件夹下的子文件夹_绝对路径_14

五、总结

  1. 主要思路就是先读到每个文本的绝对路径之后进行打开读取。
  2. 以上代码可以稍作修改就可以用在读者您的数据处理问题上,当然是在绝大部分情况下。