用python分割fastq文件的脚本(自写)

唠唠叨叨:

因为处理ATAC-seq的原始fastq数据太大(已知GEO号在ncbi上下载),所以被老师要求用python编程分割fastq脚本,其实用软件seqkit就可以进行分割,命令简单还快速,想分多少份就分多少份,但老师说我不练怎么会编程呢,所以没办法,我这刚入门的小白,就在网上各种查资料,发现都是处理fasta格式的,因为fastq格式和fasta格式并不一样,不知道可以借鉴不,日夜研究别人的代码,以及翻找网络,读到一篇将fastq文件写入和读出的代码,理解并做出了尝试,然后又绞尽脑汁如何进行分割,后来想到按行分配,只是需要每次都查看一下文件有多少行,然后又搜了一下代码,想把两者结合起来,中间报了各种error,就反复调试,7.1的那一天上午成功了,但是我取的是10000行,不知道生成的文件为什么是7000多行,没找到原因,没有打开生成的文件看看,下午老师过来看我发现是没有加换行符的问题,实际上输出是对的

分割fastq脚本:

需要引入时间函数(此处参考网上),可以看脚本分割用了多久

gz文件打开需要引入gzip函数

from datetime import datetime

import re

import sys

def Main():#定义函数,读入fastq文件

    source_dir = sys.argv[1] #传入的参数1:目标文件夹所在目录

    read_number=int(sys.argv[2]) #传入的参数2:需要分割的行数,需要是4的倍数,脚本里需要验证一下

    target_dir = sys.argv[3]#传入的参数3:分割后文件所在的目录

    #print(target_dir)

    fas={}

    id=None

    name = 1

    N=0 #读取数据的行数数值,初始值为0

    if read_number%4 != 0:

      print("参数错误,程序退出")

      sys.exit()

    else:

      print("开始。。。。。")

      print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

      with gzip.open(source_dir,'rb') as f:

          for line in f:

            N+=1

            if line.decode()[0]=="@":

                id=line.decode().strip().split()[0][1:]#对二进制文件进行解码

                fas[id]=[]  #将该id对应的初始值为空

            else:

                seq=fas[id].append(line.decode()) 

                #print(fas)

            if N==read_number:

            #  with gzip.open(target_dir+'/57.%04d.fq.gz'%(name),'wb') as out:

                #  print(target_dir+'/57.%04d.fq.gz'%(name))

                    if re.findall('r1', source_dir, flags=re.IGNORECASE):  #正则匹配可以不区分大小写 或直接判断R1是否在source_dir里,需大写:if R in source_dir:

                        with gzip.open(target_dir+'.R1.%04d.fq.gz'%(name),'wb') as out:

                            print(target_dir+'.R1.%04d.fq.gz'%(name))

                            for id,seq in fas.items(): 

                                res = '@'+id+"/1"+"\n"+seq[0]+seq[1]+seq[2]

                                out.write(res.encode())

                        name+=1

                        N=0

                        fas={}

                    else:

                        with gzip.open(target_dir+'.R2.%04d.fq.gz'%(name),'wb') as out:

                            print(target_dir+'.R2.%04d.fq.gz'%(name))

                            for id,seq in fas.items():

                                res = '@'+id+"/2"+"\n"+seq[0]+seq[1]+seq[2]

                                out.write(res.encode())

                        name+=1

                        N=0

                        fas={}

            else:

                  continue


      print("完成。。。。。")

      print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

if __name__ == "__main__":

    Main()

优化:此脚本由我的导师提出几个优化步骤又进行改进,以上是完整版,改进为:一传入参数;二对传入的文件名进行判断是含R1还是R2,如果含R1在文件的read_name后加上/1,反之R2加上/2;三将输出的文件名的数固定住

对于我的脚本有一些缺陷:如果文件生于的行数怎么办,虽然此脚本有考虑到,但我没运行成功,二就是分割的时间太慢

7月的第一天,我一个小白能写出脚本感觉异常欣慰,二是班长通知六级报名,而我去年六级竟然裸考过了,终于不用再去奔赴六级的考场了,哈哈,开心,感谢我读过的英文文献

老师版:

第二天我们老师在我旁边又教我写出另一个版本,即按read数进行分割fastq文件,不得不说我们老师真厉害,代码比我简洁多了,而且教我写出只用了一个小时,时间上也会慢些,应该是文件较大,但是不用考虑剩余行的问题,只需要提前计算好分割的reads数

import gzip

from datetime import datetime

import re

import sys

def Main():

    test_R1=False

    test_R2=False

    source_dir = sys.argv[1]

    read_number=int(sys.argv[2])

    target_dir = sys.argv[3]

    #print(target_dir)

    fas={}

    id=None

    name = 1

    N=0 #读取数据的行数数值,初始值为0

    print("开始。。。。。")

    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

    with gzip.open(source_dir,'rb') as f:

      for line in f:

        if N%(4*read_number)==0:

            if re.findall('r1', source_dir, flags=re.IGNORECASE):

                  f_out = gzip.open(target_dir+'.R1.%04d.fq.gz'%(name),'wb')

                  print(target_dir+'.R1.%04d.fq.gz'%(name))

                  test_R1 = True

                  suffix="/1"

            elif re.findall('r2', source_dir, flags=re.IGNORECASE):

                  f_out = gzip.open(target_dir+'.R2.%04d.fq.gz'%(name),'wb')

                  print(target_dir+'.R2.%04d.fq.gz'%(name))

                  test_R2= True

                  suffix="/2"

            else:

                  print("Error: R1 or R2 in filename not detected,exit")

                  sys.exit()

            name+=1 

        N+=1

        if N%4==1:

            if test_R1:

                if re.findall('/1', line.decode(), flags=re.IGNORECASE):

                    f_out.write(line)

                else:

                    f_out.write((line.decode().strip().split()[0]+suffix+"\n").encode())

            if test_R2:

                  if re.findall('/2', line.decode(), flags=re.IGNORECASE):

                    f_out.write(line)

                  else:

                    f_out.write((line.decode().strip().split()[0]+suffix+"\n").encode())

        elif N%4==3:

            f_out.write(("+\n").encode())

        else:

            f_out.write(line)


    print("完成。。。。。")

    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

if __name__ == "__main__":

    Main()

这两段代码都已运行成功

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