如何读取 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>B6TTCG$$$>C1TTTT>C2ATGC']
与输入相同
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_longest
和 zip
它返回附加 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')]
我的文件格式是这样的
>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>B6TTCG$$$>C1TTTT>C2ATGC']
与输入相同
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_longest
和 zip
它返回附加 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')]