Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在字节模式python中使用字符串替换_Python - Fatal编程技术网

如何在字节模式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*')