原创 微信公众号生信小猪 生信小猪 2024-03-30 13:40 陕西
在日常工作中,经常会遇到需要合并多个文件的情况,特别是当处理大量数据时。手动逐个打开文件进行合并既繁琐又容易出错,因此编写一个简单的脚本来完成这个任务。
这里利用Python编写的简单脚本,它能够快速合并指定文件夹下特定后缀的多个文件,并将合并结果保存为一个文件。
一、功能介绍
1)支持合并指定文件夹下特定后缀的文件。
2)可选择是否包含文件头部信息。
比如把下面example1.gene.count.txt,example2.gene.count.txt,example3.gene.count.txt 3个文件合并在一起
下面是3个文件的具体内容
二、脚本的使用方法和参数
三、运行脚本
可选择是否包含文件头部信息
不加--header参数,就不会给文件额外添加头部信息
python merge_files.py --indir ./ --postfix gene.count.txt
加--header参数,会给文件额外添加头部信息
python merge_files.py --indir ./ --postfix gene.count.txt --header
脚本参数的意义:
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)写入输出文件:脚本将合并后的数据框写入到一个输出文件中。