Python 如何使用“解码二进制文件”;对于索引,枚举(文件)中的行“;?

Python 如何使用“解码二进制文件”;对于索引,枚举(文件)中的行“;?,python,python-3.x,binary,decode,enumerate,Python,Python 3.x,Binary,Decode,Enumerate,我正在打开一个非常大的二进制文件,我正在Python 3.5中打开file1.py: with open(pathname, 'rb') as file: for i, line in enumerate(file): # parsing here 但是,我自然会遇到一个错误,因为我正在以二进制模式读取文件,然后创建一个字节列表。然后使用for循环,将字符串与字节进行比较,代码在这里失败 如果我读的是单行,我会这样做: with open(fname, 'rb') as

我正在打开一个非常大的二进制文件,我正在Python 3.5中打开
file1.py

with open(pathname, 'rb') as file:
    for i, line in enumerate(file):
        # parsing here
但是,我自然会遇到一个错误,因为我正在以二进制模式读取文件,然后创建一个字节列表。然后使用for循环,将字符串与字节进行比较,代码在这里失败

如果我读的是单行,我会这样做:

with open(fname, 'rb') as f:
    lines = [x.decode('utf8').strip() for x in f.readlines()]
但是,我使用
作为索引,枚举(文件)中的行:
。在这种情况下,正确的方法是什么?我要解码下一个对象吗

以下是我正在运行的实际代码:

with open(bam_path, 'rb') as file:
    for i, line in enumerate(file):
        line_data=pd.DataFrame({k.strip():v.strip()
            for k,_,v in (e.partition(':')
                for e in line.split('\t'))}, index=[i])
下面是错误:

Traceback (most recent call last):                                                                                                
  File "file1.py", line 18, in <module>                                                                                        
    for e in line.split('\t'))}, index=[i])                                                                                       
TypeError: a bytes-like object is required, not 'str' 
回溯(最近一次呼叫最后一次):
文件“file1.py”,第18行,在
对于第.split('\t'))行中的e,索引=[i])
TypeError:需要类似字节的对象,而不是“str”

您可以向生成器提供解码后的行,以
枚举

for i, line in enumerate(l.decode(errors='ignore') for l in f):
这样做的诀窍是在解码后产生
f
中的每一行。我添加了
errors='ignore'
,原因是使用
r
打开失败,起始字节未知


另一方面,在对
字节进行操作时,您可以将所有字符串文字替换为字节文字,即:
分区(b':')
拆分(b'\t')
,并使用
字节进行操作(熊猫可以很好地使用它们).

为什么你希望二进制文件有行?@matthias它是一种用二进制压缩的制表符分隔的文本格式。你怎么打开上面的?这是一个500 GB左右的大文件。该文件最初是一个巨大的(~500 GB)制表符分隔的文本文件,现在是二进制文件。如何打开此文件?尝试仅使用
r
打开会出现以下错误:文件“bam_File.py”,第15行,在for i中,在enumerate(文件中的l.decode()):文件“bam_File.py”,第15行,在for i中,在enumerate(文件中的l.decode()):文件“/nfs/sw/python/python-3.5/codes.py”,第321行,在decode中(结果,消耗)=self.\u buffer\u decode(数据,self.errors,final)UnicodeDecodeError:“utf-8”编解码器无法解码位置1中的字节0x8b:无效的start byteI请参见,输入字符串的一部分显然无法转换。我将使用
l.decode(errors='ignore'))对于f中的l
,用于打开文件。提供生成器还可以确保内容不会全部加载到内存中。以下是我在解码(结果,消耗)=self.\u buffer\u解码(数据,self.errors,final)中的
l.decode(errors='ignore')
:file”/nfs/sw/python/python-3.5.1/lib/python3.5/codecs.py“,第321行中得到的错误UnicodeDecodeError:“utf-8”编解码器无法解码位置1中的字节0x8b:起始字节无效,您是否再次使用
rb
打开文件?