综述:
合并文件需要三个要点: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')