基于Python的合并csv代码:一个文件夹里有多个小文件夹,每个文件夹里面都有csv,合并这些csv;

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()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值