1. 问题描述:
我有一个大文件夹,内部有一些小文件夹,每个小文件夹里面有很多csv,记录着当天所做实验的数据(注意,这些数据必须要有相同的列哦!),因为可能有很多个csv,所以尝试了写段代码来替代。
2. 不足之处:
利用的pysimplegui的exemaker封装成了小程序,但是在运行过程中,似乎对于很多个大的csv工作速度很慢(每组实验都记录了几百万行数据)。我也是初学者,所以希望大家可以提一些修改建议。谢谢!
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2023/4/10 21:45
# @Author : TuoTuo
# @FileName: 合并csv.py
# @Software: PyCharm
# @Blog :20205775@cqu.edu.cn
import os
import numpy as np
import sys
import PySimpleGUI as sg
def get_subfile_name(big_file_path):
'''
获取大文件夹里面的小文件夹名字
:param big_file_path: 大文件夹路径
:return: 返回大文件夹下的小文件夹名字
'''
datanames = os.listdir(big_file_path)
list = []
for i in datanames:
list.append(i)
return list
def combinecsv_ws(folder_path,folder_name):
'''
:param folder_path: 小文件夹的路径,很重要!
:param folder_name: 小文件夹的名字,只是为了保存的时候存成这个名字,如小文件夹叫:file1
:return: 把小文件夹里面的所有csv合并,存成小文件夹的名字,如file1.csv
'''
file_name = []
for filename in os.listdir(folder_path):
file_name.append(filename)
print(f'合并文件的顺序如下:')
print(file_name)
first_file = f'{folder_path}\\{file_name[0]}'
begin = np.loadtxt(first_file,
dtype=float,
delimiter=',')
row,col = begin.shape
sum__ = []
sum__.append(row)
for i in range(1,len(file_name)):
first_file = f'{folder_path}\\{file_name[i]}'
df = np.loadtxt(first_file,
dtype=float,
delimiter=',')
row,col = df.shape
sum__.append(row)
merged = np.vstack((begin,df))
begin = merged
print(f'合并之前共有:{sum(sum__)}行')
print('合并之后的尺寸:')
print(merged.shape)
np.savetxt(f"{folder_name}.csv",merged,delimiter=',')
def final_work_ws(big_file_path):
'''
首先利用get_subfile_name获取大文件夹里面的各个小文件夹;然后调用combinecsv_ws对每个小文件夹的内容合并
:param big_file_path: 大文件夹的路径
:return:
'''
your_file_names = get_subfile_name(big_file_path)
subfile_name_path = []
for i in range(0,len(your_file_names)):
temp = f'{big_file_path}\\{your_file_names[i]}'
subfile_name_path.append(temp)
for i in range(0,len(subfile_name_path)):
combinecsv_ws(subfile_name_path[i],your_file_names[i])
print('如果不熟悉pysimplegui可以调用下面两行代码。把sg.set_option开始的东西都注释掉')
#big_file_path = 'C:\\Users\86177\Desktop\myadsas'
# final_work_ws(big_file_path)
sg.set_options(font=('微软雅黑',15))
Layout = [
[sg.Text(f'请输入大文件路径:(右键复制文件地址,不加引号)')],
[sg.In(key='input')],
[sg.Button('确定')]
]
window = sg.Window('合并文件夹内每个文件夹里的csv',Layout)
while True:
event,values = window.read()
if event == None:
break
if event == '确定':
final_work_ws(values['input'])
sg.Popup('合并完成!请到当前文件夹路径查看')
window.close()