(Python)切割行直到大文件中的符号并附加到其他文件 - 最快的方法

时间:2013-08-23 03:44:56

标签: python regex string find

需要你的帮助。我必须删除所有行,直到第一个'>'从file2遇到并将这些行追加到file1的末尾。实际上我使用linux'split'命令将一个大文件拆分成多个小文件,并且一些条目(以'>'开头)分散在两个文件中。所以,我只想通过将提醒条目复制回一个文件来拼接这些条目。

示例文件1:

>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE

示例文件2:

AFGGGGGGGGGGGG
DEEEEEEEEEEE
>2
AAAABBBBBBBBB
DFFFFFFFFFFFFF
DFFFFFFFSSSS

在上面的示例中,File2有前两行属于File1,因此需要从File2中删除并附加到File1的末尾。

这样做的一种方法可能是:

fh1 = open(file1,'a')
fh2 = open(file2, 'r+')
filelist2 = file2.split('>')
string = filelist2[0]
fh1.write(string)
<SOME WAY TO REMOVE LINES TILL SYMBOL FROM FILE1>
fh1.close()
fh2.close()

我知道有几种方法可以实现这一点,但问题是两个文件都很大~600MB。此外,这将通过循环在4~10个文件上完成。所以,我正在寻找最有效和最快速的方法,因此需要你的建议。

等待你的建议

AK

3 个答案:

答案 0 :(得分:1)

def open_next(ct):
    return open("flnm_%05d.out" % (ct), "w")

in_files = ["f1", "f2", "f3", "f4"] # or whatever are your input files
ct = 0 
out_fp = open_next(ct)
for in_f in in_files: # your file1, file2, file3...
    for ln in open(in_f):
        if ln.startswith(">"):
            out_fp.close()
            ct += 1
            out_fp = open_next(ct)
        else:
            print >> out_fp, ln.rstrip()

那样的东西?

答案 1 :(得分:1)

听起来您正在尝试从以任意行号分割的FASTA文件重建序列。最好的解决方案是首先在序列边界处将它们分开。使用pyfasta

$ pyfasta split -n 6 original.fasta

根据文档,这会将original.fasta拆分为6个相对均匀的文件。

在您进行修改后,您可以使用csplit代替split

csplit -zk original.fasta "/^>/+<offset>" "{*}"

偏移量是在查找正则表达式时将跳过的行数(如果没有它,则将每个序列拆分为单个文件)。您可以根据所需的文件长度播放该值。

答案 2 :(得分:1)

我的看法。有两个问题:您想要连接不同的文件,然后再resplit。所以我们分别做了这两个实现干净的实现

import sys
from itertools import chain

def file_reader(filename):
    "Iterate over the lines of file, opening it lazily"
    with open(filename) as f:
        for i in f:
            yield i.rstrip()

filenames = sys.argv[1:]
all_lines = chain(*[ file_reader(fn) for fn in filenames ])

# now all_lines is an iterable that iterates over the all input lines
outf = None
for line in all_lines:
    if line.startswith('>'):
        # open new file
        if outf:
            outf.close()
        # take the file number from the '>2' line
        outf = open('out-%04d.txt' % int(line[1:]), 'w')

    # python 2
    print >> outf, line

if outf:
    outf.close()

运行
python resplit.py File1.txt File2.txt

获取 out-0001.txt

>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE

out-0002.txt

>2
AAAABBBBBBBBB
DFFFFFFFFFFFFF
DFFFFFFFSSSS