找回密码
 会员注册
查看: 30|回复: 0

Python批量提取多个csv文件内指定行数据并汇总在新csv文件内

[复制链接]

7

主题

0

回帖

22

积分

新手上路

积分
22
发表于 2024-9-8 09:50:15 | 显示全部楼层 |阅读模式
有时候我们需要统计软件分析出来的数据,这些数据保存到了csv文件中,而我们需要对比这些数据差异,就需要一个个的打开csv文件,而后找到数据复制粘贴出来,自己整理对比,而当数据文件比较多的时候,一个个打开复制就会显得比较耗时,那我们可以利用Python脚本来批量处理这些文件,这里我假如有3个csv文件数据:而我们的目标是提取‘mt’这一列第4行到第7行的数据,话不多说,看下怎么操作吧。这里我们先将脚本放在要处理文件的目录下,这样我们可以获取当前路径直接处理文件了。首先我们就要获取当前路径,然后遍历路径下的csv文件:#获取当前路径current_path=os.getcwd()#获取当前路径下所有CSV文件的文件名csv_files=[fforfinos.listdir(current_path)iff.endswith('.csv')]接下来就是对每个csv文件中的数据进行提取操作了,利用pandas存储列表数据,首先我们可以设定一些参数,比如上面所说的列名为‘mt’的这一列,以及第4到第7行:target_column='mt'start_row=2end_row=5'运行运行利用loc函数进行定位:forcsv_fileincsv_files:df=pd.read_csv(os.path.join(current_path,csv_file),error_bad_lines=False,encoding='utf-8')#提取指定列、行范围的数据extracted_data=df.loc[start_row:end_row,target_column]当然如果单纯就是第几列的话,这边需要用iloc函数,比如我们提取的是第二列,那么将上述的target_column改为1,这里注意区间是左闭右开,所以ens_row要改为6,不然就会少一行数据:target_column=1start_row=2end_row=6#遍历每个CSV文件,提取数据并保存到新的CSV文件中forcsv_fileincsv_files:df=pd.read_csv(os.path.join(current_path,csv_file),error_bad_lines=False,encoding='utf-8')extracted_data=df.iloc[start_row:end_row,target_column]#区间是左闭右开这里其实我们已经完成了提取操作,print一下:接下来我们需要将这些数据汇总到一个新csv中,并且想让这些数据一行一行输出,也就是转置,如果不想转置也无所谓,看个人需求。我们先将数据存储到sum_data列表中,然后在写入csv中:sum_data=[]#遍历每个CSV文件,提取数据并保存到新的CSV文件中forcsv_fileincsv_files:df=pd.read_csv(os.path.join(current_path,csv_file),error_bad_lines=False,encoding='utf-8')#提取指定列、行范围的数据extracted_data=df.iloc[start_row:end_row,target_column]#区间是左闭右开sum_data.append(extracted_data)df2=pd.concat(sum_data,axis=1)#df3=pd.pivot(df2)#转置df3=df2.T#保存提取的数据到新的CSV文件中new_csv_file='sum.csv'df3.to_csv(os.path.join(current_path,new_csv_file),index=True,header=False)最终结果,这里将列名去掉了,只保留了行名也就是index=True,header=False的作用:在这过程中遇到pd.read_csv报错,可以参考这篇博客:利用pandas读取csv文件时遇到UnicodeDecodeError问题以及解决过程-CSDN博客完整代码附上:#-*-coding:utf-8-*-importosimportpandasaspd#获取当前路径current_path=os.getcwd()#获取当前路径下所有CSV文件的文件名csv_files=[fforfinos.listdir(current_path)iff.endswith('.csv')]#指定要提取的列和行范围#target_column='mt'#假设提取'mt'列target_column=1#假设提取2列start_row=2#假设要提取从第3行开始end_row=6#假设要提取到第6行结束sum_data=[]#遍历每个CSV文件,提取数据并保存到新的CSV文件中forcsv_fileincsv_files:df=pd.read_csv(os.path.join(current_path,csv_file),error_bad_lines=False,encoding='utf-8')#提取指定列、行范围的数据#extracted_data=df.loc[start_row:end_row,target_column]extracted_data=df.iloc[start_row:end_row,target_column]#区间是左闭右开#print(extracted_data)#添加数据sum_data.append(extracted_data)df2=pd.concat(sum_data,axis=1)#df3=pd.pivot(df2)df3=df2.T#print(df3)#保存提取的数据到新的CSV文件中new_csv_file='sum.csv'df3.to_csv(os.path.join(current_path,new_csv_file),index=True,header=False)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 22:46 , Processed in 0.451500 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表