python--将多个文件合并成一个文件,并在最后添加文件名列

原创 微信公众号生信小猪 生信小猪 2024-03-30 13:40 陕西

        在日常工作中,经常会遇到需要合并多个文件的情况,特别是当处理大量数据时。手动逐个打开文件进行合并既繁琐又容易出错,因此编写一个简单的脚本来完成这个任务。

        这里利用Python编写的简单脚本,它能够快速合并指定文件夹下特定后缀的多个文件,并将合并结果保存为一个文件。

一、功能介绍

        1)支持合并指定文件夹下特定后缀的文件。

        2)可选择是否包含文件头部信息。

        比如把下面example1.gene.count.txt,example2.gene.count.txt,example3.gene.count.txt 3个文件合并在一起

下面是3个文件的具体内容

3d2a19e9dbf047f098708a2a7bbb9a11.png

14f08be4e2034f4c8fe007aada407010.png

a51bd399c0ca4cd99f933d6855146b60.png

二、脚本的使用方法和参数

a4561062eb32405e8115ca8ef09a971f.png

三、运行脚本

可选择是否包含文件头部信息

不加--header参数,就不会给文件额外添加头部信息

python merge_files.py --indir ./ --postfix gene.count.txt

355b359644d74b65a0a528659d845fcf.jpg

加--header参数,会给文件额外添加头部信息

d9730e6aa12c424c8f64a4d16c05aa94.png

python merge_files.py --indir ./ --postfix gene.count.txt --header

4f41c8ef7442487e95b83d96ff10cedf.png  

脚本参数的意义:

        1)--indir ./: 这个参数指定了输入文件所在的目录。在这个例子中,./ 表示当前目录,也就是运行脚本的目录。如果您希望从其他目录读取输入文件,可以将 ./ 更改为相应的目录路径。

        2)--postfix gene.count.txt: 这个参数指定了需要合并的文件的后缀。在这个例子中,后缀为 gene.count.txt 的文件将被合并。如果您的文件名是以不同的后缀结尾的,您需要相应地修改此参数来匹配您的文件名后缀。

        3)--header: 这个参数表示输入文件是否包含表头信息。如果指定了此参数,脚本会假设第一行是表头,并在合并后的输出文件中保留这个表头。如果您的文件没有表头,可以不指定这个参数,这样脚本会从文件内容开始读取数据。

        综上所述,运行这个命令会在当前目录下查找所有以 gene.count.txt 结尾的文件,并将它们合并成一个文件。合并的结果将被写入到一个新的输出文件中,保留了输入文件的表头信息。

四、下面是本次帖子所用merge_files.py脚本的所有内容

#!/usr/bin/env python

import argparse
import os
import pandas as pd

def merge_files(input_dir, postfix, header):
    # 获取输入目录中符合指定后缀的文件列表
    infiles = [os.path.join(input_dir, f) for f in os.listdir(input_dir) if f.endswith(postfix)]

    merged_tbl = None  # 初始化合并的数据框

    for f in infiles:
        # 提取第一个符号.前的内容作为样本名
        s = os.path.basename(f).split('.')[0]

        # 读取文件为数据框,指定分隔符为制表符,是否包含头部信息由参数header指定
        tbl = pd.read_table(f, sep="\t", header=0 if header else None)

        # 添加样本名列
        tbl['sample'] = s

        if merged_tbl is None:  # 如果合并的数据框为空
            merged_tbl = tbl
        else:  # 如果合并的数据框不为空
            merged_tbl = pd.concat([merged_tbl, tbl], ignore_index=True)

    return merged_tbl

if __name__ == "__main__":
    # 解析命令行参数
    parser = argparse.ArgumentParser(description="merge many files result")
    parser.add_argument("--indir", help="input dir", type=str, default="./")
    parser.add_argument("--postfix", help="input file postfix", type=str)
    parser.add_argument("--header", help="input file contain header ?", action="store_true")
    args = parser.parse_args()

    # 拼接输出文件路径
    output = os.path.join(args.indir, f"merged.{args.postfix}")

    # 如果输出文件已经存在,则先删除
    if os.path.exists(output):
        os.remove(output)
        print("Existing output file deleted.")

    # 合并文件
    merged_tbl = merge_files(args.indir, args.postfix, args.header)

    # 将合并后的数据框写入输出文件
    merged_tbl.to_csv(output, sep="\t", index=False, header=args.header, mode="w")
        这个脚本的功能是合并指定目录下特定后缀的多个文件,并将合并后的结果写入到一个输出文件中。具体功能包括:

        1)解析命令行参数:脚本使用argparse库解析命令行参数,包括输入目录、文件后缀、是否包含文件头部信息等参数。

        2)合并文件:脚本遍历输入目录中符合指定后缀的文件,读取每个文件的内容,并将其合并到一个数据框中。

        3)添加样本名列:脚本提取每个文件名中第一个符号 前的内容作为样本名,并将其作为新的一列添加到合并后的数据框中

        4)写入输出文件:脚本将合并后的数据框写入到一个输出文件中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值