python脚本截取fastq序列

前言

  最近在学习单细胞方面的知识,遇到了一个小的需求就是截取需要的fastq序列。先来说一下为什么有这个需求,一般来说单细胞的测序文件有三个如test_R1.fastq.gz、test_R2.fastq.gz、test_I1.fastq.gz。其中R1、R2就是测序的read1、read2,I1则是样本的index文件(基本上用不到)。这里需要提醒的是一般单细胞的read1是cell barcode和umi序列文件(10x的barcode一般为16nt,umi为10nt),read2文件中的序列才是真正的基因表达量的reads。虽然测序得到双端150bp的fastq,但read1中有很大一部分是无效的序列。为了只保留有效的序列就要去原始序列中截取有效的序列丢掉无效的数据,那么如何解决这个问题?一时半会没有想到有什么现成的工具可以完成,于是乎我就自己写了一个python脚本来完成这个需求。

结果

下面来看看我到底做了啥,比如我现在有如下的fastq文件:

@SRX8108993.1 1 length=151
NTCTCCTCACCGCTAGGGTCACGCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTCCCATTTTAATCTTTTTTTTCCTTCTCTAAGTCCCTTTTCTTCTGCTTTCCGATTATCACATTTTTCTTTCCCATGTTTATGTTCTCTTACCCTTC
+
#AA-FFFJ7JJFJ<7<-AFJFJAFJ-JJJJJJJJJJJJJJJJJJJJJJJJJJAFA-<-------77AA-<77------7<--777--7-7)<-<---7--7-7------7-77--7---<A--7-7----)-----7---7<------7-)
@SRX8108993.2 2 length=151
NACACAACATCTCCCATCCTTGTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGTTTTTTTTTTTTTATTTTTTATTTTTTTTTTATAATCATATCAGATTTTTATTAGAAAGTGACCTCACACAATTTTCCAATCCTCTTTACCTAC
+
#AAAFA-F-7A-JJJFFJFFJFFJFJJJJJJJJJJJJJJJJJJJJJJJJJJJJJF<---7-A<--AF7<A-7A-<7--77<7<-<<FJ7-----77--7-7-77------7---------)-)-)-7------77-----7<---------

现在需要截取5'端的26个碱基,生成新的截短的fastq文件:

@SRX8108993.1 1 length=151
NTCTCCTCACCGCTAGGGTCACGCCT
+
#AA-FFFJ7JJFJ<7<-AFJFJAFJ-
@SRX8108993.2 2 length=151
NACACAACATCTCCCATCCTTGTTTT
+
#AAAFA-F-7A-JJJFFJFFJFFJFJ

  其实完成这个任务很简单,用Linux的awk命令就可以解决,像这样80多个G的单细胞数据,其实用awk来干这件事估计七八个小时的时间也能处理完。但是如果用python写一个处理的小脚本,这样以后就可以重复利用了,还是挺好的。于是就是写了一段代码,内容如下:

#!/usr/bin/env python3
import gzip
import itertools
import sys,os
from io import BufferedReader, TextIOWrapper

#read fastq to records
def read_fastq(fastq,length):
    if fastq.endswith('gz'):
        fastq_file = TextIOWrapper(BufferedReader(gzip.open(fastq, mode='rb')))
    else:
        fastq_file = open(fastq, mode='rt')
    while True:
        read=itertools.islice(fastq_file, 4)
        head=next(read)
        length=length if length else head[head.rfind('='):]
        element = ''.join([head,next(read)[0:int(length)]+os.linesep,next(read),next(read)[0:int(length)]+os.linesep])
        if element is not '':
            yield element
        else:
            break
    fastq_file.close()
    return element

#write reads to gz file
def write_fastq(reads,out):
    out = gzip.open(out+'.fastq.gz','wb')
    for read in reads:
        out.write(read.encode())

if __name__ == "__main__":
    if len(sys.argv)!=4:
        print('Error:\n\tUsage: python3 %s fastq length outprefix' % sys.argv[0])
        sys.exit(1)
    reads=read_fastq(sys.argv[1],sys.argv[2])
    write_fastq(reads,sys.argv[3])

脚本使用方法如下:

python3 fastq_trim.py SRX8108993_1.fastq.gz 26 trim_SRX8108993

  代码看起来还是听简单的,脚本使用起来也是相当的简单,只需要三个命令行参数分别为原始的fastq文件(gz压缩和非压缩的格式都可以)、需要截取的长度、新的fastq文件名的前缀(如示例的代码会生成截取后的名为trim_SRX8108993.fastq.gz压缩格式的新文件)。

最后

 emm,今天就分享到这里,有需要的朋友可以拷贝代码使用,有什么不对的地方可以留言告诉我一下。

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