无法从我的.txt 文件中提取必要的信息

问题描述 投票:0回答:1

0 .17 .29 天
1 .29 .73 k 躺着
1 .73 .84 克 小时

这是我正在处理的 .txt 文件的示例。

我尝试使用 np.loadtxt() 提取最后一列,

    syl_array = []
    try:
        fid = open(syl_file, 'r')
        syl_array = np.loadtxt(fid, usecols=(0, 1, 2, 3), dtype={'names': ('a', 'b', 'c', 'd'), 'formats': ('i4', 'f4', 'f4', 'U10')})
        fid.close
    except:
        print('File does not exist')
        return

    labels = syl_array['a']
    spurtStartTimes = syl_array['b']
    spurtEndTimes = syl_array['c']
    syllables = syl_array['d']

此代码给出以下输出

--['d' 'k' 'g']--


但是我想要的输出是,

--['d ih', 'k l ay n d', 'g ih']--


我希望同一行中的每一组音节成为数组中的一个元素。我如何实现这一目标?

numpy dataset text-files
1个回答
0
投票

如果您可以控制文件本身的生成方式,那么您缺少的是有意义的分隔符。这里的问题是,任何标准解析器都无法知道

0
.17
之间的空格意味着您希望这些值位于不同的列中,而
d
ih
之间的空格则不然就是这个意思。

如果将表示列的空格替换为空格以外的分隔符(即逗号或制表符),则可以让 numpy 执行您想要的操作。

"""
syl_file contents:
0\t.17\t.29\td ih
1\t.29\t.73\tk l ay n d
1\t.73\t.84\tg ih
"""
arr = np.loadtxt(
    syl_file,
    delimiter="\t",
    dtype=dict(
        names=('a','b','c','d'),
        formats=('i4','f4','f4','U10')
    )
)
print(arr)
"""
Output:
array(
    [
        (0, 0.17, 0.29, 'd ih'),
        (1, 0.29, 0.73, 'k l ay n d'),
        (1, 0.73, 0.84, 'g ih')
    ],
    dtype=[('a', '<i4'), ('b', '<f4'), ('c', '<f4'), ('d', '<U10')]
)
"""

但是,如果您确实无法控制

syl_file
的生成方式,那么您将需要编写自己的自定义解析器。根据文件的大小,您可以编写如下简单的内容:

rows = []
with open("/tmp/tmp.txt") as f:
    for row in f.readlines():
        if row.strip() == "":
            continue
        parsed = row.split()
        parsed[0] = int(parsed[0])
        parsed[1:3] = map(float, parsed[1:3])
        parsed[3] = " ".join(parsed[3:]) # Combine the remaining columns into a single value
        rows.append(parsed[:4]) # Our result is in the first 4 columns!

arr = np.array(rows, dtype=object)
© www.soinside.com 2019 - 2024. All rights reserved.