(Python)从大文件中切分行直到符号,然后附加到其他文件中——这是最快的方法

(Python)从大文件中切分行直到符号,然后附加到其他文件中——这是最快的方法,python,regex,string,find,Python,Regex,String,Find,我需要你的帮助。我必须删除所有行,直到在file2中遇到第一个'>',并将这些行附加到file1的末尾。实际上,我已经使用linux“split”命令将一个大文件拆分为多个小文件,其中一些条目(以“>”开头)分散在两个文件中。所以,我只想通过将提醒条目复制回一个文件来缝合这些条目 >1 AAAAAAAAAAAAAA CGGGGGGGGGGGGG DEEEEEEEEEEEEE AFGGGGGGGGGGGG DEEEEEEEEEEE 示例文件1: >1 AAAAAAAAAAAAAA C

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

>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
示例文件1:

>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
示例文件2:

AFGGGGGGGGGGGG
DEEEEEEEEEEE
>2
AAAABBBBBBBBB
DFFFFFFFFFFFFF
DFFFFFFFSSSS
>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
在上面的示例中,File2的前两行属于File1,因此需要从File2中删除并追加到File1的末尾

>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
一种方法是:

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()
>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
fh1=打开(文件1,'a')
fh2=打开(文件2,“r+”)
filelist2=file2.split(“>”)
string=filelist2[0]
fh1.写入(字符串)
fh1.关闭()
fh2.关闭()
我知道有几种方法可以实现这一点,但问题是这两个文件都是大的~600MB。此外,这将通过循环在4~10个文件上完成。因此,我正在寻找最有效和最快的方法,因此需要您的建议

>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
等待您的建议

>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
AK

>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE

类似于这样的情况?

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

>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
根据文档,这将original.fasta拆分为6个大小相对均匀的文件

>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
编辑后,您可能还可以使用
csplit
而不是
split

csplit -zk original.fasta "/^>/+<offset>" "{*}"
>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
csplit-zk original.fasta/^>/+“{*}”

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

My take。有两个问题:要连接不同的文件,然后重新打印。因此,为了实现一个干净的实现,我们分别执行这两个步骤

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()
>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
作为

python resplit.py File1.txt File2.txt
>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
并获取out-0001.txt

>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
out-0002.txt

>1
AAAAAAAAAAAAAA
CGGGGGGGGGGGGG
DEEEEEEEEEEEEE
AFGGGGGGGGGGGG
DEEEEEEEEEEE
>2
AAAABBBBBBBBB
DFFFFFFFFFFFFF
DFFFFFFFSSSS

我试着读了很多次你的问题,但我还是什么都不懂。@Antii:如果帖子不清楚,很抱歉,我已经编辑过了。谢谢。我花了一些时间为python3安装了“pyfasta”,而且“pyfasta”的作者也更新了版本,以便更好地与python3兼容。我想我的问题还不够清楚。这是一个很好的解释,但是我想把一个巨大的文件分成几个部分,而不是从文件2的开头剪切遗留序列,然后粘贴到文件1的末尾。对于所有剩余的文件也是如此。保罗的回答正是我所需要的,但从来没有想到会有这样的功能。