【多线程优化】fastq文件MD5批量校验、批量解压、压缩处理脚本设计

目的:

  1. 检查从下机fastq.gz文件的完整性
  2. 可以只生成MD5文件,但不做检查
  3. 可以多线程批量解压fastq.gz
  4. 可以多线程批量压缩fastq
# -*- coding:utf-8 -*-
# Use for MD5check and compress|decompress 
# Author:Robin; Created in 20200316
import os
import sys
import time
import getopt
import re
#import filecmp

def parameter_check():
    try:
        opts, args  = getopt.getopt(sys.argv[1:],
                                    'hm:f:t:n:cdps', ['help', 'md5_file=', 'file_type=',
                                    'threads', 'new_md5_file=', 'check', 'decompress', 'press', 'sum'])
        if len(opts) == 0:
            usage()
            sys.exit()
    except getopt.GetoptError as err:
        # print help information and exit:
        print(str(err))  # will print something like "option -a not recognized"
        usage()
        sys.exit(2)

    for opt, arg in opts:
        if opt in ['-h', '--help']:
            usage()
            sys.exit()
        elif opt in ['-m', '--md5_file']:
            raw_md5 = arg
            print('raw_md5:{}'.format(raw_md5))
        elif opt in ['-f', '--file_type']:
            file_type = arg
            print('file_type:{}'.format(file_type))
        elif opt in ['-n', '--new_md5_file']:
            new_md5_file = arg
            print('new_md5_file:{}'.format(new_md5_file))
        elif opt in ['-c', '--check']:
            print('Running M5Dcheck function')
            M5Dcheck(raw_md5, file_type, new_md5_file)
        elif opt in ['-s', '--sum']:
            MD5sum(file_type, new_md5_file)
        elif opt in ['-t', '--threads']:
            cores = arg
        elif opt in ['-d', '--decompress']:
            decompress(cores, file_type)
        elif opt in ['-p', '--press']:
            compress(cores, file_type)

    return(raw_md5, file_type)



def MD5sum(file_type, new_md5_file):
    print('正在运行MD5SUM...')
    os.system('>CheckMD5.txt')
    cmd = 'find *{}  -print0| xargs -0 md5sum >>{}'.format(file_type, new_md5_file)
    stat = os.system(cmd)
    if stat:
        print('生成MD5文件有问题,请检查!')
    else:
        print('MD5文件已生成:./{}'.format(new_md5_file))


def M5Dcheck(raw_md5, file_type, new_md5_file):
    MD5sum(file_type, new_md5_file)
    raw_dict = dict()
    new_dict = dict()

    i=j=0
    with open(raw_md5, 'r') as f1:
        for line in f1:
            line = line.strip()
#            print(line)
            md5, _, check = line.split(' ')
            if re.search(r'/', check):
                check = check.split('/')[1]
            raw_dict[check] = md5

    with open(new_md5_file, 'r') as f2:
        for line in f2:
            line = line.strip()
#            print(line)
            md5, _, check = line.split(' ')
            new_dict[check] = md5

    for check in raw_dict.keys():
        if new_dict.get(check) != raw_dict[check]:
            print("文件{}的MD5值校验失败!".format(check))
            i+=1
        else:
            print('恭喜,文件{}校验成功!\n'.format(check))
            j+=1

    print('总文件数:{}个\t验证成功:{}个\t验证失败:{}个'.format(i+j, j, i))



def usage():
    print('''
    Usage:

          MD5文件校验:python ParallelMd5DeCompress.py -m <'文件的原本MD5文件'> -f <'*.文件后缀名'> -n <'新生成MD5的文件名'> -c
          只生成MD5检验文件:python ParallelMd5DeCompress.py -f <'*.文件后缀名'>  -n <'新生成MD5的文件名'> -s
          文件解压:python ParallelMd5DeCompress.py -c  -f  <'*.文件后缀名'> -d
          文件压缩:python ParallelMd5DeCompress.py -c  -f  <'*.文件后缀名'> -p
         ''')


def decompress(cores, file_type):
    #os.system('gunzip 1-Input_sequence_R2.fastq.gz')  # 89s
    pattern = 'ls {}'.format(file_type)
    fq_list = os.popen(pattern)

    status = 1
    for fq in fq_list:
        print(fq)
        status = os.system('pigz -dk -p {} {}'.format(cores ,fq))
        print(status)

        if status:
            print('{}文件解压失败,请检查!'.format(fq))
        else:
            print('{}文件解压成功!'.format(fq))
def compress(cores, file_type):
    pattern = 'ls {}'.format(file_type)
    fq_list = os.popen(pattern)
    status = 1
    for fq in fq_list:
        print(fq)
        status = os.system('pigz -k -p {} {}'.format(cores ,fq))
        print(status)

        if status:
            print('{}文件压缩成功!'.format(fq))
        else:
            print('{}文件压缩失败,请检查!'.format(fq))


if __name__ == "__main__":

    start = time.time()
    parameter_check()
    end = time.time()
    print("用时: {}s".format(end-start))

运行结果展示:

  1. 测试:
$ls
CheckMD5.txt  compress_MD5check.py  ParallelMd5DeCompress.py  raw.md5  test1.fq.gz  test2.fq.gz
$python ParallelMd5DeCompress.py

    Usage:

          MD5文件校验:python ParallelMd5DeCompress.py -m <'文件的原本MD5文件'> -f <'*.文件后缀名'> -n <'新生成MD5的文件名'> -c
          只生成MD5检验文件:python ParallelMd5DeCompress.py -f <'*.文件后缀名'>  -n <'新生成MD5的文件名'> -s
          文件解压:python ParallelMd5DeCompress.py -c  -f  <'*.文件后缀名'> -d
          文件压缩:python ParallelMd5DeCompress.py -c  -f  <'*.文件后缀名'> -p
         
$python ParallelMd5DeCompress.py -m 'raw.md5' -f '*.fq.gz' -n 'new2.md5' -c
raw_md5:raw.md5
file_type:*.fq.gz
new_md5_file:new2.md5
Running M5Dcheck function
正在运行MD5SUM...
MD5文件已生成:./new2.md5
恭喜,文件test1.fq.gz校验成功!

恭喜,文件test2.fq.gz校验成功!

总文件数:2个 验证成功:2个 验证失败:0个
用时: 0.06068730354309082s

2、实际运行:

$jobs
[1]+  运行中               python /share/nas1/Data/Users/luohb/Pipline/MD5check/test_dir/ParallelMd5DeCompress.py -m 'MD5.txt' -f '*.fq.gz' -n 'review.md5' -c | tee log &
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352