以下C代码最简单的Python等价物是什么?
#include <stdio.h>
int main(void) {
struct dog {
char breed[16];
char name[16];
};
struct person {
char name[16];
int age;
struct dog pets[2];
};
struct person p = {
"John Doe", 20, {{"Lab", "Foo"}, {"Pug", "Bar"}}
};
FILE *fp = fopen("data_from_c.txt", "w");
fwrite(&p, sizeof(p), 1, fp);
fclose(fp);
return 0;
}
我在这里的主要目标是将数据作为连续字节写入文件:
$ xxd data_from_c.txt
00000000: 4a6f 686e 2044 6f65 0000 0000 0000 0000 John Doe........
00000010: 1400 0000 4c61 6200 0000 0000 0000 0000 ....Lab.........
00000020: 0000 0000 466f 6f00 0000 0000 0000 0000 ....Foo.........
00000030: 0000 0000 5075 6700 0000 0000 0000 0000 ....Pug.........
00000040: 0000 0000 4261 7200 0000 0000 0000 0000 ....Bar.........
00000050: 0000 0000 ....
到目前为止,我已经尝试使用namedtuple
s和struct
模块来打包Python值:
from collections import namedtuple
import struct
dog = namedtuple('dog', 'breed name')
person = namedtuple('person', 'name age pets')
p = person(
name=b'John Doe',
age=22,
pets=(dog(breed=b'Lab', name=b'Foo'), dog(breed=b'Pug', name=b'Bar'))
)
with open('data_from_python.txt', 'wb') as f:
b = struct.pack('<16s i 16s 16s 16s 16s', *p)
f.write(b)
但是,*p
解包并不递归地解包可迭代对象,有什么方法可以正确地做到这一点吗?
如果有一种不涉及使用struct
或namedtuple
的替代方法,那也是受欢迎的。
1条答案
按热度按时间fwzugrvs1#
我很想创建
Person
和Dog
数据类,并向这些数据类添加方法,以处理将数据打包和解包到字节的操作。例如:
它给出了文字记录:
磁盘上的文件看起来与问题中的文件相匹配: