我正在开放一个非常大的二进制文件,我在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'
答案 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
完成工作(非常肯定熊猫和他们一起工作正常。)