蟒蛇中的一项重要功能是
AST((抽象语法树) 图书馆’s
文字评估一种 。这使您可以读取python数据类型的字符串版本:
|
>>> 从 AST 进口 文字评估 >>> #带有一些琐碎信息的示例字典 >>> myDict = “ {'someKey':1,'otherother':2}” >>> #让我们使用函数进行解析 >>> 测试Eval = 文字评估(myDict) >>> 打印 测试Eval {'someKey': 1, “ otherKey”: 2} >>> 类型(测试Eval) <类型 'dict'> |
像这样导入字典类似于 解析JSON 使用Python’sÂ
json.负载解码器。但是它也有缺点’s 的 JSON’s restrictive 数据types, 如 we can see here when 的 字典ionary contains, 对于 example, a 日期time object:
|
>>> myDict = "{'someKey': 1, 'rightNow': 日期time.datetime(2013, 8, 10, 21, 46, 52, 638649)}" >>> >>> 文字评估(myDict) 追溯 (最 最近 呼叫 持续): 文件 "<stdin>", 线 1, 在 <模组> 文件 “ /root/anaconda/lib/python2.7/ast.py”, 线 80, 在 文字评估 返回 _兑换(节点_or_string) 文件 “ /root/anaconda/lib/python2.7/ast.py”, 线 63, 在 _兑换 在 压缩(节点.键, 节点.价值观)) 文件 “ /root/anaconda/lib/python2.7/ast.py”, 线 62, 在 <基因> 返回 字典((_兑换(k), _兑换(v)) 对于 k, v 文件 “ /root/anaconda/lib/python2.7/ast.py”, 线 79, 在 _兑换 提高 ValueError(“格式错误的字符串”) ValueError: 畸形的 串 |
因此,您可以尝试编写一些代码来自己解析字典数据类型。这变得非常棘手,但是最终您可能可以容纳所有常见的数据类型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
定义 read_dict(d): ”“接受包含字典的字符串。 试图对此进行解析并返回字典。”” parsed_dict = {} #结果 #删除{}并分成大块 d = d[1:-1].分裂(',') #遍历大块并尝试解释它们 对于 kv_pair 在 d: #由中央结肠分裂 kv_pair = kv_pair.分裂(“:”) #解释键和值 k = 我是什么(kv_pair[0]) v = 我是什么(kv_pair[1]) #添加到最终解析的字典中 parsed_dict[k] = v 返回 parsed_dict 定义 我是什么(事情): ”“解释字符串的简单尝试 数据类型。可以处理字符串和整数”” #删除任何反引号 如果 事情.以。。开始(“”) 要么 事情.以。。开始(“”): 事情 = 事情[1:-1] #Now检查数据类型(尽管还有更多方法) 如果 事情.等轴(): 返回 整型(事情) #返回数字 其他: 返回 事情 #返回字符串 #如果任何一个都无法识别,则返回错误 返回 “数据损坏” |
但这仍然没有’t truly fix our 日期time object problem:
|
>>> read_dict(myDict) 追溯 (最 最近 呼叫 持续): 文件 "<stdin>", 线 1, 在 <模组> 文件 "<stdin>", 线 13, 在 read_dict IndexError: 清单 指数 出 的 范围 |
Which 是 where we 得到 至 的 crux 的 this post. I thought at 第一 that I 可以 deal 与 日期time’通过提取类来格式化
日期time.日期time(2013, 8, 10, 21, 46, 52, 638649)Â as a tuple 通过 spotting 的 brackets, 的n feeding 的 tuple back 整型o 日期time like:Â
|
>>> x = (2013, 8, 10, 21, 46, 52, 638649) >>> parsedDate = 日期time(x) 追溯 (最 最近 呼叫 持续): 文件 "<stdin>", 线 1, 在 <模组> TypeError: 一个 整数 是 需要 |
但显然不是。必须提取元组–不是通过lambda或列表理解,而是实际上使用星号表示法:
|
>>> parsedDate = 日期time(*x) >>> 打印 parsedDate 2013-08-10 21:46:52.638649 |
星号(*)将x等可迭代程序解压缩为该函数的位置参数。简单!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
定义 我是什么(事情): ”“解释字符串的简单尝试 of a 数据type. Can deal 与 str, 整型, 日期time"” #删除任何反引号 如果 事情.以。。开始(“”) 要么 事情.以。。开始(“”): 事情 = 事情[1:-1] #现在检查某些数据类型 如果 事情.等轴(): 返回 整型(事情) #返回数字 小精灵 事情.以。。开始('约会时间'): #获取括号之间的数字 事情 = 事情.分裂('(')[1].分裂(')')[0] #parse 的 digits, unpack 整型o 日期time 和 返回 返回 日期time(*[整型(x) 对于 x 在 事情]) 其他: 返回 事情 #返回字符串 #如果任何一个都无法识别,则返回错误 返回 “数据损坏” |