前言
我们在数据读取和处理的时候,常常会遇到很不规整的数据,需要我们自己去写脚本或者程序去批量处理,这个工作是很常见的,并且对于遍历的时候如何正确运用os、open、pandas、re等都是十分重要的,对于我们的数据主要分为.csv .txt等等,对于其他很多类型比如DAT其实和.csv的读取相似,都是用pandas去读取较为方便处理,而对于可以用Notepad++来打开的文本文件,一般来说pandas处理较为不方便或者不能处理,一般都是用open来打开进行遍历每一行进行处理的,这里我对处理这些文件做一个小小的总结和总体写的框架的分享。
一、文件的组成
这边demo我设计为差不多四层,如下图所示,不在赘述
这边我使用jupyter lab去编写.ipynb的程序,位置关系如下:
二、读取文件夹名称
首先我们需要先利用os读取每个最底层文件夹名称
这里都是基本的代码写法,我不想做过多说明,自行捋一下肯定都明白了。
之后我们获取每个底层文件夹中的所有文件,也就是说我们要处理这些文件我们需要得到 这些所有最终文件的相对路径。
这边的做法就是再来一次一样的操作进行循环遍历即可获得,如下:
步骤如下:
- os.listdir得到这个路径文件夹下一层的所有文件名,并组成list
- 通过这个list进行每个文件夹名遍历,并利用os.path.join形成对应于上一层的绝对路径
- 利用这个思维可以嵌套出下下层的所有文件路径
三、读取文本内容
3.1 读文本内容
很多很不常见的格式比如.000等文本格式,其实都是可以用Notepad++打开,基本上都是用open来读取
文件为
代码如下:
可见空行依然会读出来, 我这里设置i的作用就是让大家一下子明白for循环的那句的具体作用是读取文本中的每一行内容。
3.2 内容解析
首先看看读取的是什么类型的。
读取的都是string类型。
取出来之后一般都尝试着把所有的数据整理到一起输出.csv文件或者.h5文件,这里为了让大家看到更直观,我们生成.csv,主要思路就是创建一个空的dataframe,之后把每一个line的数据进行插入,当然在插入之前需要最好确定下columns和每一个插入的数据的具体类型。
这里除了第二列都是int型。
3.3 输出文件
打开如下:
四、总体完整程序
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保留
五、总结
- 主要思路就是先读到每个文本的绝对路径之后进行打开读取。
- 以上代码可以稍作修改就可以用在读者您的数据处理问题上,当然是在绝大部分情况下。