I have a problem with a list written in a DAT.
If I write a list in a DAT cell, when I read it, I cannot extract an item in the list
here is the script:
liste = [0,13,15,23]
op(‘table1’)[0,0] = liste
liste2 = op(‘table1’)[0,0]
and the answer
[0, 13, 15, 23]
Traceback (most recent call last):
File “</project1/text1:op(’/project1/text1’).run()>”, line 1
td.Error: File “/project1/text1”, line 6
TypeError: ‘td.Cell’ object is not subscriptable
Results of run operation resulted in exception.
I need to be able to read it as a list to parse it on another tables.
Someone have a solution? Its 4 hours I am blocked on that, searching every possible way. I tried making a dictionary saved in operator with the same problem.
Thank you in advance!
listeDat.toe (3.4 KB)
The contents of a cell are a string to TouchDesigner. You can convert this back to a list by using the
.split() python method.
We do have to do a little extra work though - we first cast your cell as a string:
Then we need to remove the brackets:
Then we need to split the contents of the string everytime there is a comma and a space
This will give you a list of strings:
If you’d like this to be a list of integers you can convert with a list comprehension:
[int(val) for val in op('table1')[0,0].val[1:-1].split(', ')]
Similarly if you want them to be floats you can do the same:
[float(val) for val in op('table1')[0,0].val[1:-1].split(', ')]
If you have control over the table, you can do comma separated values, and then us a convert DAT to turn this into columns:
row() method for table DAT’s will give you a list of columns when you ask for a specific row:
These will be cell objects, so you need these to be specific data types, you’ll need a list comprehension:
[int(val) for val in op('convert1').row(1)]
Matthew’s is a very nice Touch-centric way of doing it.
I am more of a brute-force Python guy, so just use this:
liste2 = eval(op(‘table1’)[0,0].val)
This converts the cell data into a Python object.
(EDIT: added “.val” to above code)
Thank you everybody. Ivan, your solution doesn’t work: TypeError: eval () arg 1 must be a string, bytes or code object.
Matthew, I found a similar solution during that time:
liste = [0,13,155,23]
op('table1')[0,0] = liste
liste2 = op('table1')[0,0]
liste2 = liste2.val
liste2 = liste2.split()
l = len(liste2)
liste3 = 
for i in range (0,l):
item = liste2[i]
if i == 0:
item = item[1:]
item = item[0:]
item = item [:-1]
listeDat.toe (3.6 KB)
I still hope for a more elegant solution…
Sorry added edit to my above comment. Will greatly simplify your code.
Very elegant, one line and it works.
, I must give some explanation
We tag a bunch of video clip (and sub clip) in FinalCut Pro, exporting as XML
I import and parse the XML in TD, obtaining two list:
– the list of clips, name of the file, TC in and TC out, attached keywords
– the list of keywords with, for each clip, the list of attached clip. I have tried to put each clip number in different column but the task of retrieving it block the movie play. With list I can randomise it and parse it easily.
Ivan technic works with DAT but also with python dictionaries, opening great expectations.
This is exactly what I was looking for, thanks!