其实逻辑都一样,就是提取出想要的数据,然后写入新的列表,对多个文件重复操作,最终将这多个文件中提取出的数据合并到一个嵌套的列表中,再写入新的excel文件
Part1:xlrd合并多个excel中指定的数据
①按每行指定列的数据进行提取
②合并提取出的数据(本质上是列表的合并)
③写入新的Excel文件
import xlrd
import os
import pandas
# 导入多个文件的路径,读取
path = r"C:/data_count"
files = os.listdir(path)
datas = [] # 这里是先定义一个空列表,最后把数据放进去
for file in files:
firm_name = re.sub('_.+?','',file.strip())
workbook = xlrd.open_workbook(path+'/'+file)
# 打开workbook的指定sheet
sheet = workbook.sheets()[0]
# 读取行数
max_row=sheet.nrows
for row in range(1, max_row):
# 写入数据
data = [firm_name, sheet.cell(row, 1).value, sheet.cell(row, 4).value, sheet.cell(row, 5).value]
print(data)
# 打包加入嵌套列表
datas.append(data)
# 最后正常写入新文件即可
frame = pd.DataFrame(datas, columns=['firm_name','year', 'content1', 'content2'],dtype=int)
frame.to_excel(r'C:\合并.xlsx')
Part2:pandas合并多个excel文件
2.1 merge
这种方法适用于数据格式不标准,需要对齐处理的
docs = os.listdir(path)
dfs = [] # 提前定义好一个收纳所有df的dfs列表
# names = []
for doc in docs:
print(doc)
df = pd.read_excel(path+'/'+doc)
df.columns = df.columns.str.replace('\n','')
for j in range(len(df)): # 遍历df的每一行
n = df['学校名称'][j]
df.loc[j, '学校名称'] = re.sub('\(|(','',str(n)).replace(')','').replace('(','').replace(')','') # 对该列的每一行的值进行字符处理(loc索引)
# 注意,这里是对原df进行原位处理,没有生成新的df
print(df.shape)
dfs.append(df)
# 最关键的一步,将列表dfs写入新的df
df_merge = reduce(lambda left,right: pd.merge(left,right,on='学校名称'), dfs)
# print(df_merge.head())
print(df_merge.shape)
df_merge.to_excel(path+output)
2.2 concat
这种方法适用于数据格式标准,无需对齐的(与Part1的应用场景相同)
docs = os.listdir(path)
dfs = []
for doc in docs:
print(doc)
df = pd.read_excel(path+'/'+doc, index_col=None)
df.columns = df.columns.str.replace('\n', '').str.replace('(', '').str.replace(')', '').str.replace('(', '').str.replace(')', '')
print(df.shape)
# print(df.columns)
dfs.append(df)
df_new = pd.concat(df, axis=1) # 注:axis=1表示竖着连接
# dfs可以直接是[df1, df2, ..., dfn]
print(df_new.head())
df_new.to_excel(path+output)