Skip to main content
 首页 » 编程设计

python之与 numpy 中的 unix cut -c 等效的行为

2025年05月04日13jiqing9006

当我使用 bash 并且我想剪切我知道在哪一行的文本文件的一部分时,我使用这样的东西:

X=$(sed -n ''$j'p' FINAL.CRD | cut -c 23-37) 

那是因为我通常知道我需要的信息在哪里,在那种情况下是在字符 23 和 37 之间。

我正在尝试用 python 做同样的事情,但我没有找到如何使用 np.loadtxt

我的文本文件是这样的:

IMPZ               3  WWA        3.06  4.51  7.32 
MTSF               2  W W        1.52  1.72  0.18 
PI01               2   AA        4.02  3.32 10.26 
PI02               2  A A        4.58  2.29  0.40 

我想得到 3.06、1.52、4.02、4.58。但是,有时文件会显示“WWA”或“W W”,因此我无法使用 usecols。但是我知道这个数字总是在行的哪一部分,这就是为什么我想要像 cut -c 这样对字符/字节偏移量进行操作的原因。

请您参考如下方法:

此np.loadtxt 解决方案归功于 Jon Clements:

np.loadtxt('FINAL.CRD', usecols=-3) 返回每行末尾的第三个字段(默认情况下,空格用作分隔符):

In [193]: np.loadtxt('FINAL.CRD', usecols=-3) 
Out[193]: array([ 3.06,  1.52,  4.02,  4.58]) 

即使文件每一行可能包含不同数量的字段,只要您要查找的值可以被表征为“倒数第三个字段”,那么 np.loadtxt('FINAL .CRD', usecols=-3) 可以完成这项工作。


下面是如何使用 NumPy 读取具有固定宽度字段的文件:

np.genfromtxt可以通过将整数(宽度)列表指定为 delimeter 来读取具有固定宽度字段的文件:

In [180]: np.genfromtxt('FINAL.CRD', dtype=None, delimiter=[22,37-22], usecols=[1]) 
Out[180]:  
array([b'WWA        3.06', b'W W        1.52', b' AA        4.02', 
       b'A A        4.58'], 
      dtype='|S15') 

在哪里

% cat FINAL.CRD 
IMPZ               3  WWA        3.06  4.51  7.32 
MTSF               2  W W        1.52  1.72  0.18 
PI01               2   AA        4.02  3.32 10.26 
PI02               2  A A        4.58  2.29  0.40 
% sed -n ${j}p FINAL.CRD | cut -c 23-37 
WWA        3.06 
W W        1.52 
 AA        4.02 
A A        4.58 

然而,使用 cut -c 指定列索引,使用 np.genfromtxt 指定 delimiter 中字段的宽度范围。因此,第一个字段(我们想要忽略的)的宽度为 22,第二个字段(我们想要的)的宽度为 37-22。要仅获取第二个字段,请指定 usecols=[1]。


也许我误解了文件格式,但如果你想要 [ 3.06, 1.52, 4.02, 4.58], 然后根据您发布的文件,np.genfromtxt 命令将是:

In [181]: np.genfromtxt('FINAL.CRD', dtype=None, delimiter=[25,37-25], usecols=[1]) 
Out[181]: array([ 3.06,  1.52,  4.02,  4.58])