python - 使用 zlib 以 C 语言读取 Python 压缩数据

标签 python c numpy compression zlib

我有一个 C 代码,可以为物理模拟写入多个数据文件。这些数据文件基本上是包含二维值映射的文本文件,范围从 -1 到 +1。它们可能很大(每个大约 100 Mb),但由于许多值通常是相同的(+1 或 -1 的长字符串),我认为压缩它们是个好主意。

写入该文件的 C 代码的相关部分如下:

FILE *fp1;
char file1[] = "output_file.dat";
fp1 = fopen(file1,"w");
for ( i = 0; i < Nx; i++ ) {
    for ( j = 0; j < Ny; j++ ) {
        fprintf(fp1, "%.5f ", creal(phi[i*Ny+j]));
    }
    fprintf(fp1, "\n");
}
fclose(fp1);

读取文件的 Python 代码的相关部分是:

import numpy as np
data = np.loadtxt("output_file.dat")

现在,我尝试使用 zlib 库添加压缩。我按以下方式更改了 C 代码:

# include <zlib.h>
gzFile fp1;
char file1[] = "output_file.dat";
fp1 = gzopen(file1,"w");
for ( i = 0; i < Nx; i++ ) {
    for ( j = 0; j < Ny; j++ ) {
        gzprintf(fp1, "%.5f ", creal(phi[i*Ny+j]));
    }
    gzprintf(fp1, "\n");
}
gzclose(fp1);

以及 Python 代码:

import numpy as np
import zlib
compressed_data = open("output_file.dat", 'rb').read() 
data = zlib.decompress(compressed_data)

C 代码似乎运行良好。正在写入数据文件,它们小于 2 Mb(考虑到内容的冗余,这是合理的)。不幸的是,Python 脚本给了我一个错误:

error: Error -3 while decompressing data: incorrect header check

任何人都可以指出我如何调试这个的正确方向吗?谢谢!

最佳答案

好吧,解决方案非常简单。基本上,如果我使用 .gz 扩展名编写数据文件:

# include <zlib.h>
gzFile fp1;
char file1[] = "output_file.gz";
fp1 = gzopen(file1,"w");
for ( i = 0; i < Nx; i++ ) {
    for ( j = 0; j < Ny; j++ ) {
        gzprintf(fp1, "%.5f ", creal(phi[i*Ny+j]));
    }
    gzprintf(fp1, "\n");
}
gzclose(fp1);

然后,我可以使用loadtext函数来读取它们,它们将被numpy自动解压:

import numpy as np
data = np.loadtxt("output_file.gz")

或者,我仍然可以使用 zlib.decompress 函数,但再传递一个参数(如 this 问题中所述):

zlib.decompress(compressed_data, 15 + 32)

关于python - 使用 zlib 以 C 语言读取 Python 压缩数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55595997/

相关文章:

Python - 如何将字典作为值而不是引用传递给 defaultdict

python - tensorflow 中的output_data[output_ids == i] = input_data[input_ids == i]

python - 用 Python 的 elementtree 替换作为数字字符引用一部分的&符号

python - numpy 数组 C api

c - 在 OpenCL C 中实现 sleep()

c - 将 fread 与 struct 一起使用时出现奇怪的错误

python - 如何使用 np.save 将文件保存在 python 的不同目录中?

python - 允许单个 IP 使用 HTTPBasicAuth 通过 Flask 进行身份验证

python-2.7 - Python多维数组

python - Pandas 四舍五入小数不起作用