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