python | 批量提取出每一个 xls 文件中的所需列,并重命名列名,保存到同一个新的 xls 文件中

当前文件布局:
python | 批量提取出每一个 xls 文件中的所需列,并重命名列名,保存到同一个新的 xls 文件中_第1张图片
python | 批量提取出每一个 xls 文件中的所需列,并重命名列名,保存到同一个新的 xls 文件中_第2张图片
目标:
python | 批量提取出每一个 xls 文件中的所需列,并重命名列名,保存到同一个新的 xls 文件中_第3张图片
python | 批量提取出每一个 xls 文件中的所需列,并重命名列名,保存到同一个新的 xls 文件中_第4张图片

代码

"""
说明:该程序实现将每个xls文件中的指定列提取出来,整合在一个新的xls中,保存到新路径中
"""
import os
# import openpyxl  # openpyxl模块可实现对excel文件的读、写和修改,只能处理xlsx文件,不能处理xls文件
import pandas as pd
import xlrd  # 读xls。只能读xls,不能读xlsx
import xlwt  # 写xls。只能写xls,不能写xlsx。但是不能超过255列
"""
比较:
1、对于openpyxl模块来说,无法直接获取某一行或列的内容,openpyxl模块的sheet.rows和sheet.columns表示行和列的生成器,即generator object,需要通过循环或转换成列表、元组的形式得到行或列的值。
2、对于xlrd模块来说,可直接通过sheet.row[i]和sheet.col[i]获取行和列的内容
   对于xlrd、xlwt,行数和列数从0开始,单元格的行和列也从0开始
   
openpyxl:只允许读取和写入.xlsx格式文件并进行增删改增查。
xlwings:允许读取和写入.xlsx和.xls两种格式文件并进行增删改查。
xlsxwriter:只允许写入.xlsx格式的文件。

"""


old_path = 'F:/DATASET-process/TCGA-GBM/xlsx-to-xls'  # 原文件夹路径
new_path = 'F:/DATASET-process/TCGA-GBM/all-to-one'  # 新文件夹路径
# old_path = 'F:/gdc/test'  # 原文件夹路径
# new_path = 'F:/gdc/result'  # 新文件夹路径


# 获取xlsx文件的绝对路径
def get_xlsx(old_path):
    xlsx_name_list = []  # 存放xlsx文件名
    xlsx_route = []  # 存放xlsx绝对路径
    for root, dirs, files in os.walk(old_path):
        xlsx_name_list = xlsx_name_list + files
    for file_name in xlsx_name_list:
        xlsx_route.append(old_path + '/' + file_name)
    return xlsx_route  # 返回每一个xlsx文件的绝对路径


# 读取xlsx的指定列内容,写入新的exl文件
"""
说明:第一个文件需要获取gene_id gene_name gene_type 和 fpkm_unstranded,
     其余文件只需获得fpkm_unstranded列,并重命名fpkm_unstranded_i(i=[1,174])
"""
def get_content(xlsx_route):
    count_xls = 1
    write_book = xlwt.Workbook(encoding='utf-8')  # 创建工作簿
    sheet = write_book.add_sheet('Sheet1')  # 创建工作表
    for each_xlsx, col in zip(xlsx_route, range(174)):
        book = xlrd.open_workbook(each_xlsx)
        sheet1 = book.sheet_by_index(0)
        rows = sheet1.nrows
        # 获取指定列--只要fpkm_unstranded
        fpkm_unstranded = sheet1.col_values(7)
        # 修改列名为fpkm_col(col=1,...,174)
        col_content = change_col_name(fpkm_unstranded, col)
        if col_content:
            for row in range(0, rows):
                print('写入:文件-列-行:', count_xls, col, row)  # 60065行
                sheet.write(row, col, col_content[row])  # 写入新的xls
    write_book.save(new_path + '/' + 'genes-cases.xls')
    count_xls += 1
    print('写入完成')


# 修改列名
def change_col_name(col_content, col_index):
    col_content[1] = 'fpkm_' + str(col_index)
    return col_content


def main_function(old_path, new_path):
    xlsx_route = get_xlsx(old_path)  # 获取xlsx文件的绝对路径
    get_content(xlsx_route)  # 读取xlsx的指定列内容,写入新的xls文件


main_function(old_path, new_path)

你可能感兴趣的:(python,生物信息)