如何在Python中写入纯整数(非字符串形式)至文件以适配C语言使用?
解决方案:在Python中写入二进制整数文件(兼容C语言)
要生成可被Python和C直接读取的二进制整数文件,核心是用struct模块将整数打包为二进制字节流,而非字符串形式。以下是具体修正方案:
关键知识点
- 用
struct.pack()将Python整数转换为对应C语言类型的二进制字节 - 用
struct.unpack()或struct.iter_unpack()将二进制字节还原为Python整数 - 格式符要匹配:比如
'Q'对应C的unsigned long long(64位无符号整数),'q'对应signed long long,'I'对应unsigned int(32位)
修正后的完整代码
import os import random import struct file_root = "[你的文件路径]" file_name = file_root + "Random_int64" # 写入二进制整数文件 with open(file_name, "wb") as f: for _ in range(10000): val = random.randint(0, 10000) # 打包为64位无符号整数(对应C的unsigned long long) packed_data = struct.pack('Q', val) f.write(packed_data) # 读取并解析二进制文件 with open(file_name, "rb") as f: whole_file = f.read() # 解析10000个64位无符号整数 integers = struct.unpack('10000Q', whole_file) # 或者用iter_unpack逐个解析(适合大文件) # integers = [num for num, in struct.iter_unpack('Q', whole_file)] print(integers[:5]) # 打印前5个验证
代码修正说明
- 文件打开逻辑:用
with语句自动管理文件关闭,wb模式会创建新文件或清空现有文件,无需单独判断文件是否存在 - 打包整数:
struct.pack('Q', val)将整数转换为8字节的二进制数据(64位),直接写入文件,C语言可以用fread直接读取到unsigned long long数组中 - 解析整数:
struct.unpack的参数顺序是格式字符串在前,二进制数据在后,'10000Q'表示解析10000个64位无符号整数 - 常用格式符对应表:
'B': 无符号char(1字节)'I': 无符号int(4字节)'Q': 无符号long long(8字节)'i': 有符号int(4字节)'q': 有符号long long(8字节)
C语言读取示例
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp = fopen("Random_int64", "rb"); if (!fp) { perror("Failed to open file"); return 1; } unsigned long long nums[10000]; // 直接读取10000个64位无符号整数 size_t count = fread(nums, sizeof(unsigned long long), 10000, fp); printf("Read %zu numbers\n", count); printf("First number: %llu\n", nums[0]); fclose(fp); return 0; }
内容的提问来源于stack exchange,提问作者RTC222
相关产品推荐
相关产品推荐

