Ответ 1
Это потому, что вы открываете файл в режиме байтов, и поэтому вы вызываете bytes.startswith()
, а не str.startswith()
.
Вам нужно сделать line.startswith(b'>')
, который сделает '>'
a байты буква.
Вот код:
def readFasta(filename):
""" Reads a sequence in Fasta format """
fp = open(filename, 'rb')
header = ""
seq = ""
while True:
line = fp.readline()
if (line == ""):
break
if (line.startswith('>')):
header = line[1:].strip()
else:
seq = fp.read().replace('\n','')
seq = seq.replace('\r','') # for windows
break
fp.close()
return (header, seq)
FASTAsequence = readFasta("MusChr01.fa")
Ошибка, которую я получаю:
TypeError: startswith first arg must be bytes or a tuple of bytes, not str
Но первый аргумент startswith
должен быть строкой в соответствии с документами... так что происходит?
Я предполагаю, что использую хотя бы Python 3, так как использую последнюю версию LiClipse.
Это потому, что вы открываете файл в режиме байтов, и поэтому вы вызываете bytes.startswith()
, а не str.startswith()
.
Вам нужно сделать line.startswith(b'>')
, который сделает '>'
a байты буква.
Без проверки вашего файла на try encoding на utf-8 на 'open'
fp = open(filename, 'r', encoding='utf-8')
Если осталось открыть файл в двоичном формате, замена 'STR' на байты ('STR'.encode(' utf-8 ')) работает для меня.