我正在使用标准库string template
。从模板中,我创建一个包含所有标识符的列表。例如:
list_of_identifiers = ['id', 'username', 'url']
我想迭代此列表以替换模板标识符。
xml = string.Template(xml_template)
for i in range(len(list_of_identifiers)):
xml.substitute(list_of_identifiers[i] = somevalue)
但我收到语法错误SyntaxError: keyword can't be an expression
。
我想在list_of_identifiers[i]
中使用字符串文字作为关键字。有可能吗?
我基本上在这里做的是读取带有标识符值的csv文件,然后将值替换为xml模板。但是csv文件可以包含除标识符之外的其他字段。换句话说,csv文件可以读取:
id, username, orientation, eye, expression, url
1, admin, left, sunglasses, sad, http://google.com
但是,我想要替换的标识符仅为[id, username, url]
。所以我生成两个列表:
list_of_identifiers = ['id', 'username', 'url']
col_index = ['0','1','5']
正如您所知,col_index是csv行中标识符的索引。所以我迭代了两个列表:
with open(dataFile, 'rb') as csvFile_obj:
reader = csv.reader(csvFile_obj)
for row in reader:
#
#some code to filter out first line of csv file
#
xml = string.Template(xml_template)
for i in range(len(list_of_identifiers)):
xml.substitute(list_of_identifiers[i]= row[col_index[i]])
答案 0 :(得分:1)
如其他地方所述,substitute
没有做你认为的事情 - 你需要一次性替换所有变量。使用DictReader
也会让事情变得更容易:
columns = ['id', 'username', 'url']
with open(dataFile, 'rb') as csvFile_obj:
reader = csv.DictReader(csvFile_obj)
for row in reader:
xml = string.Template(xml_template).substitute({
col: row[ident]
for col in columns
})
答案 1 :(得分:0)
你想做的事情不是直接可能的。函数调用中的关键字必须是标识符,而不是表达式。但更重要的是,关键字是静态的 - 标识符本身是关键字,而不是具有该名称的某个变量的当前值。
如果要将关键字动态传递给函数调用,可以使用dict解包。例如,以下内容是等效的:
spam(name=value)
spam(**{'name': value})
所以,在你的情况下:
xml.substitute{**{list_of_identifiers[i]: somevalue})
但是,您可能会使代码过于复杂。请注意,substitute
只能将映射作为(非关键字)参数,因此无需将其解压缩为单独的关键字参数。另外,不是单独循环和替换每一个,为什么不直接替换它们呢?
几个旁注:
for identifier in list_of_identifiers:
。substitute
不符合您的想法。它返回一个字符串,其中模板变量替换了它们的参数;它不会就地修改模板,部分替代。