我对使用Python很陌生,对C也很生疏,所以我要为自己的声音是多么愚蠢和/或丢失而预先道歉。
我在C中有一个函数,它创建一个包含数据的.dat文件。我正在使用Python打开文件来读取该文件。我需要阅读的内容之一是在C函数中创建并以二进制形式打印的结构。在我的Python代码中,我在文件的适当行中读取结构。我试过一件一件地拆开这张照片,但没有成功。结构中的大多数项在C代码中声明为“real”。我正在和其他人一起编写这段代码,主要的源代码是his,并已将变量声明为“real”。我需要将其放入循环,因为我想读取以“.dat”结尾的目录中的所有文件。要开始循环,我有:
for files in os.listdir(path):
if files.endswith(".dat"):
part = open(path + files, "rb")
for line in part:
然后我阅读了包含结构的那一行之前的所有行。然后我走到那条线上,得到:
part_struct = part.readline()
r = struct.unpack('<d8', part_struct[0])
我只是想看看结构中存储的第一个东西。我在这里看到了一个例子。当我试着这样做的时候,我得到了一个错误,上面写着:
struct.error: repeat count given without format specifier
我会接受任何人给我的建议。我已经坚持了几天,尝试了很多不同的事情。老实说,我不理解struct模块,但我已经尽可能多地阅读了它。
谢谢!
可以使用^{} 或^{} 指定文件的格式。要从C code in @perreal's answer生成的文件中读取结构:
见^{} 。它在Python3中受支持,但在Python2.7中没有针对default file object的文档。
struct.Struct
需要显式指定填充字节(x
):它产生相同的输出。
为避免不必要的复制,^{} 可用于从文件中获取结构数组:
格式说明符中的数字表示重复计数,但它必须在字母之前,如
'<8d'
。不过,您说过只想读取结构的一个元素。我想你只是想'<d'
。我想您正在尝试将要读取的字节数指定为8,但不需要这样做。d
假设是这样。我还注意到你在使用
readline
。读取二进制数据似乎是错误的。它将一直读取,直到下一个回车/换行,这将在二进制数据中随机出现。您要做的是使用read(size)
,如下所示:实际上,您应该小心,因为
read
返回的数据可能少于您的请求。你需要重复一遍。一些C代码:
一些Python代码:
输出:
但也有填充问题。
save_type
的填充大小是16,因此我们又读取了3个字符并忽略它们。相关问题 更多 >
编程相关推荐