【发布时间】:2014-02-28 23:33:18
【问题描述】:
我正在尝试从 .lrf 文件中读取一些元数据的长度。 (配合LoLReplay程序使用)
没有关于这些文件的真正文档,但我已经想出了如何在 C++ 中执行此操作。由于多种原因,我正在尝试用 python 重写项目,但遇到了一个错误。
首先解释一下,.lrf 文件在文件开头立即具有以下格式的元数据:
前 4 个字节是我不知道的。
接下来的 4 个字节以十六进制形式存储元数据的长度,直到元数据的末尾,之后是回放的实际内容。
前8个字节后的字节为json格式的元数据
我遇到的问题实际上是读取元数据长度。这是我目前拥有的功能:
def getMetaLength(self):
try:
file = open(self.file,"r")
except IOError:
print ("Failed to open file.")
file.close()
#We need to skip the first 4 bytes.
file.read(4)
mdlength = file.read(4)
print(hex(mdlength))
file.close()
当我调用这个函数时,shell 返回一个回溯状态:
Traceback (most recent call last):
File "C:\Users\Donald\python\lolcogs\lolcogs_main.py", line 6, in <module>
lolcogs.getMetaLength()
File "C:\Users\Donald\python\lolcogs\LoLCogs.py", line 20, in getMetaLength
file.read(4)
File "C:\Python32\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 3648: character maps to <undefined>
我最好的猜测是 read() 试图读取以某种 unicode 格式编码的字符,但这些绝对只是我试图读取的字节。有没有办法将这些读取为字节?另外,当您尝试读取文件时,是否有更好的方法来跳过字节?
【问题讨论】:
-
尝试以二进制模式打开文件:
f = open(self.file,"rb")。另外,不要将其命名为file,因为它会与内置的file类型名称冲突。 -
@PauloBu 不过好像没有这种类型了...
-
在 Python2.7 中定义。在 Python3 中没有。但是阅读 OP 的代码,他可能正在使用 Python 3,所以请忽略我的评论 :)
-
@PauloBu 谢谢,我使用“rb”而不是“r”,现在我得到错误“TypeError:'bytes'对象不能被解释为整数”但c ++版本必须这样做一些棘手的事情,所以我已经大致了解如何解决这个问题。
标签: python file python-3.x