将带有头部和编码问题的文件读入numpy数组

3

我有一个文件(如果你想知道,它来自Zemax,格式为PSF),看起来像这样:

Listing of FFT PSF Data

File : C:\G_Drive\Projects\MSE\Telescope\AAO_designs\MSE_PF_6u_1300-Shan-Nicolas_2.zmx
Title: MSE Prime Focus WFC with CLADC
Date : 2/9/2018
Configuration 1 of 4

FFT PSF
0.5510 µm at 0.5300, 0.0000 (deg).
Data spacing is 0.300 µm.
Data area is 153.600 µm wide.
Surface: Image (Focal surface)
Reference Coordinates: 2.02066E+02, 0.00000E+00
Pupil grid size: 256 by 256
Image grid size: 512 by 512
Center point is: row 257, column 256
Values are normalized to peak = 1.0

  1.7638E-02      1.7079E-02      1.6531E-02      1.5996E-02      1.5475E-02    ...

所以,它有一个带有文本和我想象中需要一些ISO-8859-1编码的字符的标题。 在标题后面是512行512个浮点数,我想将其导入到一个numpy数组中。

我从这里开始:

data = ascii.read(path_in + files[0], data_start=19, encoding='iso-8859-1')
n = np.array(data)
n.shape

但是数组的形状不正确:

(508,)

我也尝试了以下方法:
im = np.loadtxt(path_in + files[0], skiprows=19)

但是出现了以下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 211: invalid start byte

np.loadtxt不接受不同的编码。

我尝试过一些方法,例如:

arr = np.fromiter(codecs.open(path_in +files[0], encoding='iso-8859-1'), np.float)

但这与页眉不同:
ValueError: could not convert string to float: 'Listing of FFT PSF Data\r\n'

最后,我在这里找到了一些类似的问题:读取 Unicode 元素到 NumPy 数组中,但是它:

s = codecs.open(path_in + files[0], encoding='iso-8859-1').read()
im = np.loadtxt(s)

我遇到了"IOPub数据速率超过限制"的错误消息,尽管我已经大幅提高了速率。


在Numpy 1.14中,loadtxt函数有一个encoding参数。也许你可以升级你的SciPy包? - lenz
由于某些原因,我无法在MacOSX上使用conda/anaconda将Numpy更新至1.13.3以上。 - Nicolas
切换到conda / anaconda 64位后,我成功地更新到Numpy 1.14版本,并能够使用具有encoding参数的loadtxt函数!非常感谢@lenz。 - Nicolas
很高兴听到它起作用了。由于您的问题已经获得了一些赞,回答这个问题可能是值得的。为什么不回答自己的问题,描述一下您是如何让它工作的呢?这对未来的读者可能会有帮助。 - lenz
1个回答

0

解决方案是使用带有encoding参数的Numpy 1.14中的loadtxt

然而,在当时升级到Numpy 1.14时,我不得不切换到anaconda-64。


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