Python批量处理文件

宋正兵 on 2020-10-22

在实验中采集完成数据后要对数据进行处理,需要把 mega.csv 中的两种数据提取出来分别存放到 SourceAdcData.csvFreqDomainData.csv 中。通过面向互联网编程,找到了解决方法是利用 os.walk 来实现。

对单个文件进行数据提取

读取

pd.read_csv(filepath, header=None, index_col=False)

可选参数说明:
filepath:路径URL,可以使http、ftp、s3和file

sep:指定分隔符,默认是’,’

header:指定第几行作为列索引,如果没有指定,默认header=0,header=None时指明原始文件数据没有列索引,这样read_csv会自动加上列索引

index_col:将真实的某列当作index,默认为None,即不指定行索引,这样系统会自动加上行索引。

usecols:返回给定列表的子集,即返回指定列名的数据

获取DataFrame的某行数据

loc通过行和列的名字获取值,也支持切片操作。

获取单行数据:df.loc[raw],其中raw可以是行名,也可以是行索引

获取多行数据:df.loc[[raw1,raw2]]

同时选定行和列:df.loc[raw,col]

同时选定多行和单列:df.loc[[raw1:rawn],[col]]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd

source_adc_data = pd.DataFrame()
freq_domain_data = pd.DataFrame()

mega = pd.read_csv('mega.csv', header=None, index_col=False)

turn = 1

for i in range(0, len(mega)):
if (turn == 1):
source_adc_data = source_adc_data.append(mega.loc[i])
turn = 0
else:
freq_domain_data = freq_domain_data.append(mega.loc[i])
turn = 1

source_adc_data.to_csv('SourceAdcData.csv', header=None, index=None)
freq_domain_data.to_csv('FreqDomainData.csv', header=None, index=None)

遍历目录下所有文件和目录

使用 os.walk 能够做到,for root,dirs,files in os.walk("D:\test"):

  • root 所指的是当前正在遍历的这个文件夹的本身的地址

  • dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)

  • files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)

获取test目录下的所有文件

1
2
3
4
5
6
for root,dirs,files in os.walk("D:\test"):
for file in files:
#获取文件所属目录
print(root)
#获取文件路径
print(os.path.join(root,file))

获取test目录下的所有目录

1
2
3
4
5
6
for root,dirs,files in os.walk("D:\test"):
for dir in dirs:
#获取目录的名称
print(dir)
#获取目录的路径
print(os.path.join(root,dir))

最终代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import pandas as pd
import os

def splite_data(file_path):
print(file_path + '\mega.csv')
source_adc_data = pd.DataFrame()
freq_domain_data = pd.DataFrame()
mega = pd.read_csv(file_path + '/mega.csv', header=None, index_col=False)
turn = 1
for i in range(0, len(mega)):
if (turn == 1):
source_adc_data = source_adc_data.append(mega.loc[i])
turn = 0
else:
freq_domain_data = freq_domain_data.append(mega.loc[i])
turn = 1
source_adc_data.to_csv(file_path + '/SourceAdcData.csv', header=None, index=None)
freq_domain_data.to_csv(file_path + '/FreqDomainData.csv', header=None, index=None)


data_path = 'C:\\Users\\songzb\\Desktop\\实验\\实验数据'

# root 所指的是当前正在遍历的这个文件夹的本身的地址
# dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
# files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)

for root,dirs,files in os.walk(data_path):
for file in files:
if (file == 'mega.csv') and ('SourceAdcData.csv' not in files):
splite_data(root)

然后通过验证生成文件的列数来判断是否正确

1
2
3
4
5
6
7
8
cols=766
for root,dirs,files in os.walk(data_path):
for file in files:
if (file == 'SourceAdcData.csv'):
df = pd.read_csv(root + '\SourceAdcData.csv', header=None, index_col=False)
if (df.shape[1] != cols):
print(df.shape[1])
print(root+ '\\' + file)