繁体   English   中英

如何将JavaScript字典转换为Python语法

[英]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'}

建议使用demjson 发表评论 之一 这确实有效,并且似乎是一个更好的解决方案。

import demjson
demjson.decode('{one:"1", two:"2"}')

输出:

{u'two': u'2', u'one': u'1'}

对于不包含任何封闭对象的琐碎对象 ,这是一个基本的字符串处理问题。

一旦有了复合对象,我将向您展示的代码将失败。

让我们启动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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM