如何使用“for index,line in enumerate(file)”解码二进制文件?

时间:2016-10-04 20:44:26

标签: python python-3.x binary decode enumerate

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

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()]

但是,我正在使用for index, lines in enumerate(file):。在这种情况下,正确的方法是什么?我要解码下一个对象吗?

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

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' 

1 个答案:

答案 0 :(得分:2)

您可以将带有解码行的生成器提供给enumerate

for i, line in enumerate(l.decode(errors='ignore') for l in f):

在解码之后,f中产生每一行的技巧是什么呢?我添加了errors='ignore',因为r的打开失败了一个未知的起始字节。

顺便说一句,你可以在bytes上操作时用字节文字替换所有字符串文字,即:partition(b':')split(b'\t')并使用bytes完成工作(非常肯定熊猫和他们一起工作正常。)