一些基于python的批量处理方法
为什么要用python批处理?
我们在工作中,遇到庞大的图片量,数据量时,若手动分类,则需要大量时间和精力。为提高效率,我这里有几种批量处理的方法,分别是对csv文件和图片。也是在此对自己的代码做一个记录。
针对csv的批处理(分割文件)
场景:
上级给了一份非常大的csv文件,光打开就要好久。文件的第2列,第3列表示时间序列(分,秒)。根据时间序列,顺序将csv分割,并存放在文件夹中。
首先,我们要对文件进行切割。即2s为一个切割窗口,保留对应行的所有数据。
import csv
import os
csvpath = './room32_3.csv'
folder_path = '.room323'
# 此文件目的是将数据文件按照时间段分割,每个时间段的数据存储在一个csv文件中
# 以上两个路径,csvpath为要处理的文件路径。folder_path为要新建的文件夹路径
# 打开csv文件
with open(csvpath, 'r') as f:
# 创建csv读取器
reader = csv.reader(f)
# 读取所有数据
data = list(reader)
# 存储分钟、秒和数据
minutes = []
seconds = []
values = []
for row in data:
minutes.append(int(row[1]))
seconds.append(float(row[2]))
values.append([str(x) if i < 9 else str(x) for i, x in enumerate(row[3:])])
# 计算时间段
time_intervals = [int((minutes[i] * 60 + seconds[i])) // 2 for i in range(len(minutes))]
# 存储数据
data_intervals = [[] for _ in range(len(set(time_intervals)))]
for i in range(len(values)):
data_intervals[time_intervals[i]].append(values[i])
# 创建文件夹
if not os.path.exists(folder_path):
os.makedirs(folder_path)
# 保存数据
for i, data_interval in enumerate(data_intervals):
if i < 150:
file_path = os.path.join(folder_path, str(i + 1) + '.csv')
print('file {} done'.format(i + 1))
else:
file_path = os.path.join(folder_path, '151.csv')
print('file {} done'.format(151))
with open(file_path, 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(data[0])
for j in range(len(data_interval)):
if j % 2 == 0:
writer.writerow([str(x).replace('(', '').replace(')', '') for x in data_interval[j]])
print('data done')
# 遍历文件夹中的所有csv文件
for file_name in os.listdir(folder_path):
if file_name.endswith('.csv'):
# csv文件路径
file_path = os.path.join(folder_path, file_name)
# 打开csv文件
with open(file_path, 'r') as f:
# 创建csv读取器
reader = csv.reader(f)
# 读取所有数据
data = list(reader)
# 删除第一行的前三列数据
for row in data:
del row[0:3]
# 将第一行的其余数据向前移动3列
for i in range(3, len(data[0])):
data[0][i-3] = data[0][i]
del data[0][-3:]
# 保存处理后的数据
with open(file_path, 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(data)
代码解释:
values.append([str(x) if i < 9 else str(x) for i, x in enumerate(row[3:])])
此处是储存分 秒和整行数据的地方。可是实际在我的csv文件中,4-12列都是整型数,12列以后全部都是复数。因此需要这样处理。之前考虑过对复数使用complex ,对整型数使用 int。可是后面存储数据部分会报错。因为列表不接受’float’。
# 计算时间段
time_intervals = [int((minutes[i] * 60 + seconds[i])) // 2 for i in range(len(minutes))]
这部分是对时间计数分割操作。前面我们已经将分,秒存入数组中了。那么按照2s一个的窗口进行切割。该数组同样需要转换为int,原因同上。
# 遍历文件夹中的所有csv文件
for file_name in os.listdir(folder_path):
if file_name.endswith('.csv'):
# csv文件路径
file_path = os.path.join(folder_path, file_name)
# 打开csv文件
with open(file_path, 'r') as f:
# 创建csv读取器
reader = csv.reader(f)
# 读取所有数据
data = list(reader)
# 删除第一行的前三列数据
for row in data:
del row[0:3]
# 将第一行的其余数据向前移动3列
for i in range(3, len(data[0])):
data[0][i-3] = data[0][i]
del data[0][-3:]
# 保存处理后的数据
with open(file_path, 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(data)
这部分是什么呢,很多人不大理解。
是这样的。我在完成前面操作后发现切割后的所有文件第一行都比其他行多了三列,元素为:0 0 0
这显然是我在前面处理时出了问题。数组保留了原有的小时 分钟 秒这三个元素。可是我实在是不想回看了,因此完成了此部分:将每个文件的第一行前三个元素删除,并将后续元素向前移动3格
python批处理2:批量文件分类
场景
我在前面做好文件分割以后,老板给我一个txt文本文件,要求我按照对应顺序对分割好的csv文件分类,放入各自的文件夹。
什么意思呢?
txt中有一系列数字,数字与数字之间用 /t 隔开。一共151个数字。数字为0-3,即一共四个文件夹。将txt变为数组,每个元素对应我按时间序列分割好的csv文件。现在将对应的文件送入数组对应的文件夹中。
这倒是不难,无非就是获取文件夹下所有csv文件,然后按顺序依次遍历,查找对应txt数组的编号然后保存文件嘛。
mport numpy as np
import os
from matplotlib import pyplot as plt
import shutil
def readtxt(path):
with open(path, 'r') as f:
data = f.read().split('\t')
data = [int(x.strip()) for x in data]
data = np.array(data)
return data
path = '这里存放你要用的txt文件'
folder_path = 'csv文件所在文件夹'
new_folder_path = '你要复制csv文件的新文件夹,新文件夹下要创建4分小文件,在下文有实现'
data = readtxt(path)
# 遍历文件夹中的所有csv文件
for i, file_name in enumerate(os.listdir(folder_path)):
if file_name.endswith('.csv'):
# csv文件路径
file_path = os.path.join(folder_path, file_name)
# 如果data数组中对应的数为0,则将文件复制到新的路径下
if data[i] == 0:
folder_path_num = os.path.join(new_folder_path, str(data[i]))
new_file_name = 'room323'+file_name
new_file_path = os.path.join(folder_path_num, new_file_name)
shutil.copyfile(file_path, new_file_path)
elif data[i] == 1:
folder_path_num = os.path.join(new_folder_path, str(data[i]))
new_file_name = 'room323'+file_name
new_file_path = os.path.join(folder_path_num, new_file_name)
shutil.copyfile(file_path, new_file_path)
elif data[i] == 2:
folder_path_num = os.path.join(new_folder_path, str(data[i]))
new_file_name = 'room323'+file_name
new_file_path = os.path.join(folder_path_num, new_file_name)
shutil.copyfile(file_path, new_file_path)
elif data[i] == 3:
folder_path_num = os.path.join(new_folder_path, str(data[i]))
new_file_name = 'room323'+file_name
new_file_path = os.path.join(folder_path_num, new_file_name)
shutil.copyfile(file_path, new_file_path)