gpt4 book ai didi

python - 从 c 中创建的结构中读取 python 中的结构

转载 作者:太空狗 更新时间:2023-10-29 17:58:51 25 4
gpt4 key购买 nike

我对使用 Python 很陌生,对 C 也很生疏,所以我提前为我听起来多么愚蠢和/或迷茫而道歉。

我在 C 中有一个函数可以创建一个包含数据的 .dat 文件。我正在使用 Python 打开文件来读取文件。我需要阅读的内容之一是在 C 函数中创建并以二进制形式打印的结构。在我的 Python 代码中,我位于要读入结构的文件的适当行。我试过逐项拆包 stuc 和作为一个整体拆包都没有成功。结构中的大部分项目在 C 代码中被声明为“真实的”。我正在与其他人一起编写此代码,主要源代码是他的,并且已将变量声明为“真实”。我需要把它放在一个循环中,因为我想读取目录中以“.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 模块,但我已经尽可能多地阅读了它。

谢谢!

最佳答案

你可以使用 ctypes.Structurestruct.Struct指定文件的格式。从 C code in @perreal's answer 生成的文件中读取结构:

"""
struct { double v; int t; char c;};
"""
from ctypes import *

class YourStruct(Structure):
_fields_ = [('v', c_double),
('t', c_int),
('c', c_char)]

with open('c_structs.bin', 'rb') as file:
result = []
x = YourStruct()
while file.readinto(x) == sizeof(x):
result.append((x.v, x.t, x.c))

print(result)
# -> [(12.100000381469727, 17, 's'), (12.100000381469727, 17, 's'), ...]

参见 io.BufferedIOBase.readinto() .它在 Python 3 中受支持,但在 Python 2.7 中未记录为 default file object .

struct.Struct 需要明确指定填充字节(x):

"""
struct { double v; int t; char c;};
"""
from struct import Struct

x = Struct('dicxxx')
with open('c_structs.bin', 'rb') as file:
result = []
while True:
buf = file.read(x.size)
if len(buf) != x.size:
break
result.append(x.unpack_from(buf))

print(result)

它产生相同的输出。

避免不必要的复制Array.from_buffer(mmap_file)可用于从文件中获取结构数组:

import mmap # Unix, Windows
from contextlib import closing

with open('c_structs.bin', 'rb') as file:
with closing(mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_COPY)) as mm:
result = (YourStruct * 3).from_buffer(mm) # without copying
print("\n".join(map("{0.v} {0.t} {0.c}".format, result)))

关于python - 从 c 中创建的结构中读取 python 中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17244488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com