python合并不同文件夹中相同的文件

综述:

     合并文件需要三个要点:python对于文件的操作,for循环对于字典的操作;如何得遍历所有文件夹而得到全部的文件(每个文件夹的文件可能不一样,所以不能漏过一个文件名);关于文件名的提取操作。

   keywords:os,  set(),  split

split:

首先来介绍最简单的文件名提取--使用split函数将文件名与后缀分开,使用方法如下:

file_name = 'sh000001.csv'
id = file_name.split('.')[0]
print(id)

>>'sh000001'

file_name = 'sh000001.csv'
id = file_name.split('.')[1]
print(id)

>>csv

OS:

使用文件操作来遍历每一个大文件夹下面的小文件的每一个小文件

base = 'E:/data/2020/'  #大文件夹
dir_names = os.listdir(base) # 打开大文件夹后的各个小文件夹名dir_names
for dir in dir_names:  #遍历每一个小文件夹
   file_path = base+dir
   file_names = os.listdir(file_path)  #打开小文件夹后每一个CSV文件的名称
   for file in file_names:  #遍历小文件夹里的每一个文件
      file_name = file_path+'/'+file

set()

         set类似于list但是set不允许里面有重复的元素,而且set里的内容位置是随意的,所以不能用索引列出。可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。

        所以可以用set方法取出所有文件的并集

a={"122","124","234"}  #取交集
b={"124","263"}
c=a.difference(b)
print(c)

a=["sabu","dbua","gg"] #将list转换为应不同set(),注意set()格式与普通list不同,set={‘’,‘’}为大括号
s=set(a)
print(s)


>>{'122', '234'}

>>{'gg', 'sabu', 'dbua'}

代码:

import pandas as pd
import os

def merge_data(id):
    '''
      给出一个id,即这个小文件夹中的某一个文件的文件名,在所有文件夹中找出它
    然后合并在一起
    :param id:
    :return: 每个文件中相同id的一个合并文件df_all
    '''
    base = 'E:/data/2020/'  #大文件夹
    cols_name = ['date', 'time', 'open', 'high', 'low', 'close', 'volume', 'money']
    dir_names = os.listdir(base) # 打开大文件夹后的各个小文件夹名dir_names
    df_all = pd.DataFrame()
    for dir in dir_names:  #遍历每一个小文件夹
        file_path = base+dir
        file_names = os.listdir(file_path)  #打开小文件夹后每一个CSV文件的名称
        for file in file_names:  #遍历小文件夹里的每一个文件
            file_name = file_path+'/'+file

            if file.split('.')[0] == id:
                    df = pd.read_csv(file_name, header=None, names=cols_name)
                    df_all = df_all.append(df, ignore_index=True, sort=True)
                    order = ['date', 'time', 'open', 'high', 'low', 'close', 'volume', 'money']
                    # 对于列进行重排序
                    df_all = df[order]
                    print(df_all)

    return df_all


if __name__ == '__main__':
    # df = merge_data('sh000001')
    # print(df)
    base = 'E:/data/2020/'
    dir_names = os.listdir(base)
    ids = set()  # set()可以看做一个列表,这里面不包含重复的元素,不可以使用索引
    for dir in dir_names:
        file_path = base+dir
        file_names = os.listdir(file_path)
        for file_name in file_names:
            id = file_name.split('.')[0]  #id表示这一个股票的代码
            ids.add(id)  #把所有id放入ids中,这样不会有重复的id存在

    for id in ids:
        df = merge_data(id)
        base = 'E:/data/result/'
        id_path = base + id + '.csv'
        # if id[:2] == 'sh':
        #     continue
        # df.to_csv(id_path, index=None)
        # print(id_path, ' over')

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值