1

需要你的帮助。我必须删除所有行,直到从 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

4

3 回答 3

1

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

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

退出-0001.txt

>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE

out-0002.txt

>2
AAAABBBBBBBBB
DFFFFFFFFFFFFF
DFFFFFFFSSSS
于 2013-08-23T05:30:43.987 回答
1

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

$ pyfasta split -n 6 original.fasta

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

在您进行编辑之后,您可能还可以使用csplit代替split

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

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

于 2013-08-23T04:56:50.667 回答
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()

类似的东西?

于 2013-08-23T04:12:14.533 回答