[英]How to convert JavaScript dictionary into Python syntax
从启用JavaScript
应用程序(例如Adobe)内部将javascript
字典写到外部.jsx文件(使用dict.toSource()
)中,结果字典的上下文如下所示:
({one:"1", two:"2"})
(请注意,字典键是因为它们是变量名而写的(不正确)。下一步是使用Python读取此.jsx文件。我需要找到一种转换方法({one:"1", two:"2"})
转换成Python字典语法,例如:
{'one':"1", 'two':"2"}
已经有人提出,代替使用JavaScript
的内置dict.toSource()
,使用JSON
更为有意义, JSON
可以使用类似于Python
语法的方式编写字典内容。 但不幸的是,使用JSON
并不是我的选择。 我需要找到一种单独使用Python将({one:"1", two:"2"})
转换为{'one':"1", 'two':"2"}
方法。 关于如何实现的任何建议? 再一次,问题主要出在字典键语法中,在Python内部看起来像变量名,而不是像字符串的字典键名:
one vs "one"
这是从JaveScript
内部导出的JavaScript
词典的结果,output.txt文件的内容。 目的是将output.txt文件的内容读入Python并将其转换为Python字典。 请记住,字典仅在这里那么简单。 在现实世界中,它将是一个兆字节长,带有许多嵌套的键/值。
再次,output.txt的内容:
({one:"1", two:"2"})
我们需要将其转换为Python语法字典(如果在Python中使用JSON,则可以使用):
{'one':'1', 'two':'2'}
对于不包含任何封闭对象的琐碎对象 ,这是一个基本的字符串处理问题。
一旦有了复合对象,我将向您展示的代码将失败。
让我们启动Python 2.7并使用示例字符串:
>>> x='({one:"1", two:"2"})'
现在您想要的是命令
我们对dict有什么了解?
好吧,一个字典可以由(键,值)“ 2-ples”列表构成,这是指两个元素列表的列表,而不是python tuple只读列表的列表。
每个元组都表示一个属性,例如one:"1"
首先,我们需要将x简化为包含所需信息的子字符串。
显然,括号和方括号是多余的,因此我们可以这样写:
>>> left = x.find("{")
>>> right = x.find("}")
>>> y = x[left+1:right]
在这里, String.find()
方法找到搜索字符串参数的第一个索引。
x[n:m]
表示x[n:m]
的第n个字符到第m-1个字符的子串,包括端值。
获得:
>>> y
'one:"1", two:"2"'
那只是一个字符串,而不是一个元组,但是如果我们用逗号分割,它可以成为一个元组。
>>> z = y.split(",")
获得:
>>> z
['one:"1"', ' two:"2"']
现在,每个字符串都代表一个属性,我们需要弄清楚键和值。
我们可以使用列表理解(如果不熟悉,请参见教程5.1.4) 。
>>> zz = [ (s[0:s.find(":")].strip(),s[s.find('"')+1:-1].strip()) for s in z]
我们再次使用find()
获取冒号和引号的索引。
在这里,我们还使用strip()去除了空白,否则空白将蔓延到空白中。
此步骤获得:
>>> zz
[('one', '1'), ('two', '2')]
这几乎是我们想要的。
现在就
d = dict(zz)
完成了!
>>> d
{'two': '2', 'one': '1'}
请注意,dict不保留键的顺序。
使用JavaScript
我注意到它的内置.toSource()
方法将编写正确包含在引号"
dict key name "
中的键字典,如果该字典键的名称中包含非字母字符(例如空格),逗号,句号,美元符号等。例如:
JavaScript
示例:
var dictVar = {'one':'1','.two':'2', 'three,':3, 'fo ur':4,"five":"five"};
mySaveFile = new File('/my/path/to/JavaDictToPython.txt');
mySaveFile.open("w","TEXT","????");
mySaveFile.write(dictVar.toSource());
mySaveFile.close();
字典将以以下形式写入文件:
({one:"1", ".two":"2", "three,":3, "fo ur":4, five:"five"})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.