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']--
我希望同一行中的每一组音节成为数组中的一个元素。我如何实现这一目标?
如果您可以控制文件本身的生成方式,那么您缺少的是有意义的分隔符。这里的问题是,任何标准解析器都无法知道
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)