Python - 为什么这是一个格式错误的节点或字符串?
Python - why is this a malformed node or string?
我只是在整理一些代码,运行 遇到了一些麻烦。我遇到了以前从未遇到过的错误
ValueError: malformed node or string:['0.000', '37.903', 'nosing']
我在顶部的 openLabels 函数工作正常,returns 项目列表结构如您在错误消息中所见。我正在调试,发现是 labelsToFrames 函数抛出了错误。它不接受我的列表列表作为输入。我不知道为什么。
任何方向将不胜感激!
def openLabels(pathLabels):
path = (pathLabels + "*.lab")
files = glob.glob(path)
textCorpus = []
for name in files:
try:
with open(name) as f:
for line in f:
line = line.split()
textCorpus.append(line)
except IOError as exc:
if exc.errno != errno.EISDIR:
raise
return textCorpus
def labelToFrames(labelCorpus):
with labelCorpus as f_in:
for line in f_in:
song = ast.literal_eval(line)
output = []
for block in song:
block_start = float(block[0])
block_end = float(block[1])
singing = block[2]
block_range = np.arange(block_start, block_end, 0.033)
for x in block_range:
ms_start = '{0:.3f}'.format(x)
ms_end = '{0:.3f}'.format(x + 0.032)
add_to_output = [ms_start, ms_end, singing]
output.append(add_to_output)
return(output)
def main():
pathLabels = "~/Train Labels/"
labelCorpus = openLabels(pathLabels)
labelCorpusFrames = labelToFrames(labelCorpus)
main()
File "<ipython-input-7-d1a356f3bed8>", line 1, in <module>
labelCorpusFrames = labelToFrames(labelCorpus)
File "<ipython-input-2-77bea44f1f3d>", line 54, in labelToFrames
song = ast.literal_eval(line)
File "*/lib/python3.6/ast.py", line 85, in literal_eval
return _convert(node_or_string)
File "*/lib/python3.6/ast.py", line 84, in _convert
raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: ['0.000', '37.903', 'nosing']
问题是 labelCorpus
是一个列表列表。因此,当您执行 labelToFrames
并传入 labelCorpus
时,它会遍历列表列表,将每个单独的列表分配给 line
,然后尝试 运行 ast.literal_eval
在 line
上。然后失败,因为 ast.literal_eval
requires either a string or expression node,不是列表。
labelCorpus
是一个列表列表的原因是它从 openLabels
函数中被赋值。在下一节中,您将遍历 glob.glob
编辑的文件路径 return 并打开文件:
with open(name) as f:
for line in f:
line = line.split()
textCorpus.append(line)
在每个打开的文件上,您将遍历各个行,然后拆分文件中的每一行(return 是一个列表)并将其分配回 line
变量,您然后附加到 textCorpus
列表。这个列表列表就是您从函数 return 分配给 main
.
中的 labelCorpus
的内容
我不在家,所以目前无法进行试验,但我认为问题出在字符串中混入了实数。尝试先将它们转换为字符串,然后将它们传递给任何正在使用它们的函数。几个月前,我 运行 参与过一次,提前转换就是答案。
我只是在整理一些代码,运行 遇到了一些麻烦。我遇到了以前从未遇到过的错误
ValueError: malformed node or string:['0.000', '37.903', 'nosing']
我在顶部的 openLabels 函数工作正常,returns 项目列表结构如您在错误消息中所见。我正在调试,发现是 labelsToFrames 函数抛出了错误。它不接受我的列表列表作为输入。我不知道为什么。
任何方向将不胜感激!
def openLabels(pathLabels):
path = (pathLabels + "*.lab")
files = glob.glob(path)
textCorpus = []
for name in files:
try:
with open(name) as f:
for line in f:
line = line.split()
textCorpus.append(line)
except IOError as exc:
if exc.errno != errno.EISDIR:
raise
return textCorpus
def labelToFrames(labelCorpus):
with labelCorpus as f_in:
for line in f_in:
song = ast.literal_eval(line)
output = []
for block in song:
block_start = float(block[0])
block_end = float(block[1])
singing = block[2]
block_range = np.arange(block_start, block_end, 0.033)
for x in block_range:
ms_start = '{0:.3f}'.format(x)
ms_end = '{0:.3f}'.format(x + 0.032)
add_to_output = [ms_start, ms_end, singing]
output.append(add_to_output)
return(output)
def main():
pathLabels = "~/Train Labels/"
labelCorpus = openLabels(pathLabels)
labelCorpusFrames = labelToFrames(labelCorpus)
main()
File "<ipython-input-7-d1a356f3bed8>", line 1, in <module>
labelCorpusFrames = labelToFrames(labelCorpus)
File "<ipython-input-2-77bea44f1f3d>", line 54, in labelToFrames
song = ast.literal_eval(line)
File "*/lib/python3.6/ast.py", line 85, in literal_eval
return _convert(node_or_string)
File "*/lib/python3.6/ast.py", line 84, in _convert
raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: ['0.000', '37.903', 'nosing']
问题是 labelCorpus
是一个列表列表。因此,当您执行 labelToFrames
并传入 labelCorpus
时,它会遍历列表列表,将每个单独的列表分配给 line
,然后尝试 运行 ast.literal_eval
在 line
上。然后失败,因为 ast.literal_eval
requires either a string or expression node,不是列表。
labelCorpus
是一个列表列表的原因是它从 openLabels
函数中被赋值。在下一节中,您将遍历 glob.glob
编辑的文件路径 return 并打开文件:
with open(name) as f:
for line in f:
line = line.split()
textCorpus.append(line)
在每个打开的文件上,您将遍历各个行,然后拆分文件中的每一行(return 是一个列表)并将其分配回 line
变量,您然后附加到 textCorpus
列表。这个列表列表就是您从函数 return 分配给 main
.
labelCorpus
的内容
我不在家,所以目前无法进行试验,但我认为问题出在字符串中混入了实数。尝试先将它们转换为字符串,然后将它们传递给任何正在使用它们的函数。几个月前,我 运行 参与过一次,提前转换就是答案。