如何读取 Python 中带有分隔符的文件并在末尾附加字符?

How to read files with separators in Python and append characters at the end?

我的文件格式是这样的

 >1ATGC>2TTTT>3ATGC>$$$>B1ATCG>B2TT-G>3TTCG>B4TT-G>B5TTCG>B6TTCG$$$>C1TTTT>C2ATGC

注意:“$$$”分割文件,$$$ 之前的任何内容都是 Set 1,$$$ 之后的内容是 Set 2,下一个 $$$ 之后的内容是 Set3,依此类推

我必须执行以下操作:

一个。连接“>”之后的序列。所以,我必须加入 "ATGC" "TTTT" "ATGC" 并存储在 (1) 中,我必须连接 "ATCG" "TT-G" "TTCG" "TT-G" "TTCG""TTCG" 并存储为 (2)... 再次连接并存储在 (3)

输出应该是一个如下所示的列表:

("ATGCTTTTATGC","ATCGTT-GTTCGTT-GTTCGTTCG","TTTTATGC")

(2) 然后,我在此处找到具有最大长度的 Set Set(2)

(3) 如果集合 i 的长度不等于集合 (2),那么我在集合 i 的末尾添加 "Z",这样集合 i 的长度现在等于集合的长度 ( 2)

(4) 我用 "Z"

替换所有“-”

输出应如下所示:

 ("ATGCTTTTATGCZZZZZZZZZZZZ",
 "ATCGTTZGTTCGTTZGTTCGTTCG",
 "TTTTATGCZZZZZZZZZZZZZZZZ")

这是代码,我试过了:

in_file = open('c:/test.txt','r')
org = []
seqlist = []
seqstring = ""

for line in in_file:
    if line.startswith("$$$"):
         if seqstring!= "":
            seqlist.append(seqstring)
            seqstring = ""
         org.append(line.rstrip("\n"))
    elif line.startswith(">"):
        seqstring += line.rstrip("\n")
seqlist.append(seqstring)

setdraft = seqlist
maxsetlength = max(len(seqlist))

setdraft2 =[]  

for i in setdraft:
     if len(i) != maxsetlength:
         setdraft2 = i.append("Z")

setfinal =[]

for j in setdraft2:
     if j in setdraft2 =="-":
         setfinal = j.insert ("Z")

以上脚本无效。它给了我多个错误。 例如。当我打印 setdraft 它给我输出

['>1ATGC>2TTTT>3ATGC>$$$>B1ATCG>B2TT-G>3TTCG>B4TT-G>B5TTCG>B‌​6TTCG$$$>C1TTTT>C2AT‌​GC']

与输入相同

Traceback (most recent call last):
  File "C:/Users/ACER/Desktop/trial.py", line 25, in <module>
    maxsetlength = max(len(seqlist))
TypeError: 'int' object is not iterable

不清楚您的数据集有多脆弱,但如果它遵循上述模式(即最后 4 个字符是您要查找的字符),那么您可以使用几个 split()itertools.zip_longestzip 它返回附加 Z

>>> import itertools as it
>>> import string
>>> def digit_index(s):
...     for i, c in enumerate(s):
...         if c in string.digits:
...             return i
...     return 0
...
>>> s = '>1ATGC>2TTTT>3ATGC>$$$>B1ATCG>B2TT-G>3TTCG>B4TT-G>B5TTCG>B6TTCG$$$>C1TTTT>C2ATGC'
>>> parsed = [''.join(y[digit_index(y)+1:].replace('-', 'Z') for y in x.split('>')) for x in s.split('$$$')]
>>> parsed
['ATGCTTTTATGC', 'ATCGTTZGTTCGTTZGTTCGTTCG', 'TTTTATGC']
>>> [''.join(x) for x in zip(*it.zip_longest(*parsed, fillvalue='Z'))]
['ATGCTTTTATGCZZZZZZZZZZZZ',
 'ATCGTTZGTTCGTTZGTTCGTTCG',
 'TTTTATGCZZZZZZZZZZZZZZZZ']

如果您不介意将它作为一个列表,那么您可以避免join()将它变回一个字符串:

>>> list(zip(*it.zip_longest(*parsed, fillvalue='Z')))
[('A', 'T', 'G', 'C', 'T', 'T', 'T', 'T', 'A', 'T', 'G', 'C', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z'), 
 ('A', 'T', 'C', 'G', 'T', 'T', 'Z', 'G', 'T', 'T', 'C', 'G', 'T', 'T', 'Z', 'G', 'T', 'T', 'C', 'G', 'T', 'T', 'C', 'G'),
 ('T', 'T', 'T', 'T', 'A', 'T', 'G', 'C', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z')]