seq1 ATATAT >seq2 GGGGG >seq3 TTTTT 使用 re.sub,我删除了像这样带有 ">seq"数字的行,以仅输入 -6ren">
gpt4 book ai didi

python - 为什么我的代码不迭代每一行?尽管剥离了(使用 .read() 传入的 .txt 输入),但仍存在关键错误 "\n"

转载 作者:太空宇宙 更新时间:2023-11-03 20:37:31 24 4
gpt4 key购买 nike

我有一个 DNA 序列的 .txt 文件,格式如下:

>seq1
ATATAT
>seq2
GGGGG
>seq3
TTTTT

使用 re.sub,我删除了像这样带有 ">seq"数字的行,以仅输入 DNA 碱基 A、G、C 和 T 的行,然后删除“\n”如下:

ATATAT
GGGGG
TTTTT
import re
test = re.sub('\ |1|2|3|4|5|6|7|8|9|0|>|s|e|q|:', "", holder)
newone = test.rstrip("\n")

然后,我想将其用作我的一个热编码器的输入,该编码器包含在 if 语句中(有一个 if 语句用于检查 DNA 序列中是否存在任何意外的字母)。到目前为止,它看起来像这样:

for line in newone:

#if undesirable letters are present in sequence, an error message is displayed
if (bool(result)) == True:
print("The input sequence is invalid.")

#if sequence is in the correct format, proceed with one hot encoding

else:
#mapping of bases to integers as a dictionary
bases = "ATCG"
base_to_integer = dict((i, c) for c, i in enumerate(bases))

#encoding input sequence as integers
integer_encoded = [base_to_integer[y] for y in newone]

#one hot encoding
onehot_encoded = list()
for value in integer_encoded:
base = [0 for x in range(len(bases))]
base[value] = 1
onehot_encoded.extend(base)
print(onehot_encoded)

我可以在 shell 中看到这个错误,但我不确定为什么,因为我认为我已经在代码中指出“\n”需要被删除:

Traceback (most recent call last):
File "C:\Users\Agatha\Documents\testtt.py", line 38, in <module>
integer_encoded = [base_to_integer[y] for y in newone]
File "C:\Users\Agatha\Documents\testtt.py", line 38, in <listcomp>
integer_encoded = [base_to_integer[y] for y in newone]
KeyError: '\n'

我希望我的程序在输入文件的每一行上迭代代码,但我不确定如果\n 被剥离,我的 for 循环(“for line in newone”)是否会实现这一点,并且我不能弄清楚如何重新安排它以使其发挥作用。我的目标是让我的输出采用这种格式,其中每个单热编码序列都显示在单独的行上,例如:

[1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0
0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1]

如果您能提供有关此错误的根源以及如何修复它的建议,我将不胜感激。

最佳答案

如果我是您,我会使用 .split() 方法根据您阅读的文本创建一个列表。

test = re.sub('\ |1|2|3|4|5|6|7|8|9|0|>|s|e|q|:', "", holder)
newone = test.split("\n")

此时 newone 将类似于 ['', 'ATATAT', '', 'GGGGG', '', 'TTTTT', ''] 所以去掉多余的空格:

newone = [x for x in newone if x != '']

现在您收到的错误是因为您在列表理解中(代码的第 38 行)使用的是 newone 而不是 lineline 的每个字母都是字典 base_to_integer 的键,但是您得到的 KeyError 是因为 \n 不是字典中的键。即使进行了我上面建议的更改后,您也会收到错误:

KeyError: 'ATATAT'

所以你应该将此行更改为:

integer_encoded = [base_to_integer[y] for y in line] 

解决这个问题给了我:

[1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1]
[0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]

希望这有帮助。

关于python - 为什么我的代码不迭代每一行?尽管剥离了(使用 .read() 传入的 .txt 输入),但仍存在关键错误 "\n",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57075481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com