如何在Python中读取通用数据格式(CDF)

8

我需要使用Python读取CDF文件。我找到了一些库,但不知道如何使用。例如,在这个(Python lib)中,我需要下载CDF库,但不知道在哪里下载。虽然有一个CDF下载页面,但它似乎与此库无关。


你是否在寻找这个页面:http://pythonhosted.org/CDF/getting.html? - Andre Holzner
@AndreHolzner,我没有看到它。我该如何安装这些egg文件? - seleucia
1
@seleucia - 如果你的问题已经解决,你应该考虑接受一个答案。 - Matteo
4个回答

9
@miraclulixx的回答是正确的,但它假设您已经安装了CDF C库

如果在发现这个问题之前您甚至不知道CDF文件格式是什么,那么下面是一个易于跟随的指南。

1. 下载最新版本的CDF C库:

您可以在此链接中找到最新的稳定版本。使用wget下载源代码,并提取它。注意:以下代码将在当前文件夹中创建一个目录./,如果您想在其他路径中下载代码,请确保更改以下代码。

wget -r -l1 -np -nd -nc http://cdaweb.gsfc.nasa.gov/pub/software/cdf/dist/latest-release/linux/ -A cdf*-dist-all.tar.gz
tar xf cdf*-dist-all.tar.gz -C ./
cd cdf*dist

2. 安装所有依赖项:

SpacePy和CDF库有几个依赖项(由@Michal Dyzma指出)。您可以使用condapipapt安装它们全部。

pip install numpy scipy h5py matplotlib networkx
apt install build-essential gfortran libncurses5-dev

3. 编译C库:

您应该已经下载了一个包含比我提供的更多细节的README.install文件。基本上,您需要检查哪些编译变量对于您的系统和需求是必需的/可选的。

make all.help

我将使用GNU C编译器为Linux构建分发。我不感兴趣FORTRAN接口,而且我的操作系统支持共享库。我想安装基于Curses的工具包程序,以便使用基于命令行的交互式CDF工具(这就是我们在第二步中安装libncurses5-dev依赖项的原因)。因此,这是最终的make命令:

make OS=linux ENV=gnu CURSES=yes FORTRAN=no UCOPTIONS=-O2 SHARED=yes -j4 all
make install #no sudo

安装应该顺利进行,并将所有文件添加到./bin./include./lib子目录中。
4.设置环境变量:
./bin中应该有一个名为definitions.B的文件会自动帮你完成这个过程,使用chmod+x命令使其可执行,并将以下行添加到您的~/.bashrc文件里(注意: 1)我假设您已将库安装在路径$HOME/Libraries/下;2) .后面有一个空格):
. $HOME/Libraries/cdf/cdf36_3-dist/bin/definitions.B

重要说明: 上述文件在第68行存在一个错误,它不是将内容追加到环境变量LD_LIBRARY_PATH中,而是覆盖了它。修复方法很简单,将第68行替换为以下内容:

export LD_LIBRARY_PATH=$HOME/Libraries/cdf/cdf36_3-dist/lib:$LD_LIBRARY_PATH

如果某些原因没有 definitions.B,请添加以下内容:
export CDF_BASE=$HOME/Libraries/cdf/cdf36_3-dist
export CDF_INC=$CDF_BASE/include
export CDF_LIB=$CDF_BASE/lib
export CDF_BIN=$CDF_BASE/bin
export LD_LIBRARY_PATH=$CDF_BASE/lib:$LD_LIBRARY_PATH
5. 搞定了,去做好事吧:

假设您使用pip安装了 spacepy,以下内容应该可以直接运行:

from spacepy import pycdf
cdf = pycdf.CDF('/path/to/file.cdf')
print(cdf)

2
非常有帮助。但是NASA实际上不提供常见打包系统(Ubuntu/Debian、RPM等)的软件包吗?说真的?要求最终用户进行这种手动打包,而不是使用集成了安全问题和错误修复升级的软件包管理系统进行标准升级机制,是危险的且很繁琐。或者我对典型用户有什么基本的误解吗? - nealmcb
1
运行得非常好!解释得非常好。我很惊讶在谷歌搜索中没有找到任何有用的结果来获取一个示例cdf文件,但最终在分发本身中找到了几个,例如在cdf36_3-dist/samples/cacsst2.cdf中。 - nealmcb
最新稳定版本的链接已失效。 - theo-brown

3
如果您已经安装了Python的包管理工具pip,则可以按照以下方式获取spacepy cdf库:
$ pip install git+https://github.com/spacepy/spacepy.git

请注意,此操作将安装许多依赖项,包括numpy和scipy。这些可能有点难以从头开始安装。您可能希望先安装一个现成的软件包,例如anaconda。完成后,只需使用上述命令,spacepy应该很容易安装。
一旦成功安装了spacepy,根据这个示例,它应该像这样工作:
from spacepy import pycdf
cdf = pycdf.CDF('/path/to/file.cdf')
print(cdf)

在安装过程中,我遇到了这个错误:扩展程序'ffnet.fortran._ffnet'具有Fortran源代码,但未找到Fortran编译器。 - seleucia
你安装了Anaconda吗? - miraculixx
显然,你的系统缺少Fortran编译器 - 这可能会有所帮助。我开始想知道,除了CDF部分,你是否需要从spacepy中获得其他功能? - miraculixx
1
我已经安装了,但现在出现另一个错误:异常:无法从中加载CDF C库。尝试在导入之前设置os.environ [“CDF_LIB”] = library_directory。我尝试设置library_directory,但我不知道它在哪里? - seleucia
@hoangtran - 您可以检查我的答案以获得解决方案。 - Matteo
显示剩余2条评论

3
不久前我也遇到了同样的问题。我假设你正在Windows上工作...根据Spacepy文档,您需要多个依赖项才能使用其cdf模块。
首先,SpacePy仅正式支持32位python版本,因此您必须拥有323位的Python。
其次,它需要在您的系统中安装NASA CDF库(也是32位版本)。您可以从here获取它。
第三,继续进行Spacepy依赖项:
- numpy - scipy - matplotlib - h5py - networkx - ffnet
其中大部分都是Anaconda包的一部分。如果它们不是,并且您必须安装它们,只需pip install <package name>
如果您在从源代码编译时遇到问题,我建议您访问Christoph Gohlke网站,并获取与您的Python版本匹配的Windows预构建二进制文件。http://www.lfd.uci.edu/~gohlke/pythonlibs/ 这将帮助您使用Spacepy CDF模块。
您也可以尝试另一种方法。从NASA页面下载CDF-to-netCDF转换器,并在您的CDF文件上运行它。
Python具有很好的netCDF模块,可以从GitHub或Python存储库安装。在这种情况下,您还需要几个依赖项,如HDF5、netCDF-4、numpy和cython。
一旦您拥有netCDF文件,就可以使用netCDF模块或scipy.io模块访问它。

2

Maven 的 CDFLib 是一个纯 Python 的替代品。

https://github.com/MAVENSDC/cdflib

pip install cdflib

在你的代码中:

import cdflib

cdf_file = cdflib.CDF('/path/to/cdf_file.cdf')

您也可以使用此库编写CDF文件。 - Chris McCowan
你好!我一直在尝试使用cdflib,想要查看文件的内容,但是不知道如何操作。您能提供一行代码来帮助我吗?谢谢! - user11607936

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接