如何在字节模式python中使用字符串替换
守则:如何在字节模式python中使用字符串替换,python,Python,守则: 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(b
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(b'>')):
header = line[1:].strip()
else:
seq = fp.read().replace(b'\n',b'')
seq = seq.replace(b'\r',b'') # for windows
break
fp.close()
return (header, seq)
FASTAsequence = readFasta("MusChr01.fa")
“”之前的b是必需的,因为我处于字节模式。问题是在运行时,fp.read.replace和seq.replace会删除字符串中的所有内容。我确实知道read工作正常,因为
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(b'>')):
header = line[1:].strip()
else:
seq = fp.read()
break
fp.close()
return (header, seq)
FASTAsequence = readFasta("MusChr01.fa")
很好用。这是怎么回事?这是一种更简洁的函数编写方法。但我不知道为什么它对你不起作用
def readFasta(filename):
""" Reads a sequence in Fasta format """
header = seq = b""
with open(filename, 'rb') as fp:
for line in fp:
if not line:
break
if line.startswith(b'>')):
header = line[1:].strip()
else:
seq = fp.read().translate(None, b'\r\n')
break
return (header, seq)
<> > <代码> /<代码>块,代码不考虑<代码>行< /代码>。试试下面的
def readFasta(filename):
header = b""
seq = b""
with open(filename, 'rb') as fp:
while True:
line = fp.readline()
if not line:
break
if line.startswith(b'>'):
header = line[1:].strip()
else:
seq = line + fp.read() # <--- without `line +`, you lose a line.
seq = seq.translate(None, b'\r\n')
break
return header, seq
假设您使用的是Python3,这是您对字节模式的评论。您还应该为
header
和seq
的初始值设置一个b”“
,并且,line==”
应该是line==b”“
。我相信您应该使用文本模式,而不是二进制模式。如果您必须处理换行符,这意味着您的文件是文本文件,而不是二进制文件。如果不是这样,则二进制格式会因设计而被破坏,您最好创建一个新文件,将所有\r\n
替换为\n
,并使用该文件。好的,那么问题出在文件的长度上。打印无法处理数据的大小,这实际上工作正常。b'b'准确地说,是一行两行。您能添加一个小样本文件来解决您的问题吗?\n哦,它实际上适用于小文件。可能实际的问题是,所讨论的文件是190 mb。在任何迭代中,not line
条件都不能为真(否则,for
将已经停止),并且fp.read()之后的break
)
也没用,因为在下一个循环中,文件指针将位于EOF,并且的将自动停止。这仍然不能解释为什么seq
在第二个版本中包含内容function@gnibbler,不,不是。这很奇怪。看起来这一行肯定应该包括在内。这可能与文件大小有关。这个文件是190mb,当我让它一直运行时,它的内存就用完了。
>>> with open('mchu.fasta', 'rb') as f: print(f.read().decode('ascii'))
...
>MCHU - Calmodulin - Human, rabbit, bovine, rat, and chicken
ADQLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTID
FPEFLTMMARKMKDTDSEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREA
DIDGDGQVNYEEFVQMMTAK*
>>> readFasta('mchu.fasta')
(b'MCHU - Calmodulin - Human, rabbit, bovine, rat, and chicken', b'ADQLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARKMKDTDSEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMTAK*')