python脚本慢读和写gz文件

时间:2016-03-29 22:11:05

标签: python gzip

我有一个xxx.wig.gz文件,其格式为3,000,000,000行:

fixedStep chrom=chr1 start=1 step=1
0
0
0
0
0
1
2
3
4
5
6
7
8
9
10
...
fixedStep chrom=chr2 start=1 step=1
0
0
0
0
0
11
12
13
14
15
16
17
18
19
20
...

我希望

  1. 通过" chrom"将其分解。因此,每当我读到一行以" fixedstep"开头时,我创建一个新文件并关闭旧文件。
  2. 我希望通过将每个值与"阈值"进行比较来输出0/1,传递= 1否则为0
  3. 下面是我的python脚本,运行速度超慢(我预测它完成~10小时,到目前为止,2个染色体在~1小时后完成)

    有人能帮我改进吗?

    #!/bin/env python    
    import gzip    
    import re    
    import os    
    import sys   
    
    fn = sys.argv[1]    
    f  = gzip.open(fn)    
    fo_base = os.path.basename(fn).rstrip('.wig').rstrip('.wig.gz')    
    fo_ext  = '.bt.gz'    
    thres = 100    
    fo = None    
    for l in f:    
        if l.startswith("fixedStep"):    
            if fo is not None:    
                fo.flush()    
                fo.close()    
            fon  = re.search(r'chrom=(\w*)', l).group(0).split('=')[-1]    
            fo   = gzip.open(fo_base + "_" + fon + fo_ext,'wb')    
        else:    
            if int(l.strip())>= thres:    
                fo.write("1\n")    
            else:    
                fo.write("0\n")    
    if fo is not None:    
        fo.flush()    
        fo.close()    
    f.close() 
    

    PS。我认为awk可以更快地做到这一点,但我对awk并不是很好

1 个答案:

答案 0 :(得分:1)

感谢Summer编辑文本。
我在脚本中添加了缓冲读/写,现在速度提高了几倍(但仍然相对较慢):

import io    
f  = io.BufferedReader( gzip.open(fn) )    
fo   = io.BufferedWriter( gzip.open(fo_base + "." + fon + fo_ext,'wb') )    
相关问题