本博客已搬家至个人网站 在路上 - On the way 下面的 技术 分类。

你可以通过点击 更新帖子 【已解决】Python中,用eval强制将字符串转换为字典变量时候出错:NameError: name 'null' is not defined 找到当前帖子的新地址。

----------------------------------搬家声明--------------------------------------

【已解决】Python中,用eval强制将字符串转换为字典变量时候出错:NameError: name 'null' is not defined

【背景】

在python中,对于一个已经存在的字符串:

{
"reply_count":3,

...,

"title":“”,
.......

}

其内容的形式很类似于字典类型的变量,所以,希望去将其强制转换为字典类型变量,以便于后续处理。

后来找到了介绍,说是用eval强制转换即可。然后去试了,用了eval去转换,发现的确是可以的。

但是,后来去用eval强制转换另外别的一个字符串:

{
"reply_count":0,

...,

"title":null,
.......

}

却出现错误:

 Traceback (most recent call last):
  File "D:\tmp\WordPress\Others\to_wp\hi-baidu-mover_v2\hi-baidu-mover_v2.py", line 446, in <module>
    main()
  File "D:\tmp\WordPress\Others\to_wp\hi-baidu-mover_v2\hi-baidu-mover_v2.py", line 384, in main
    i=fetchEntry(permalink,datetimepattern,mode)
  File "D:\tmp\WordPress\Others\to_wp\hi-baidu-mover_v2\hi-baidu-mover_v2.py", line 98, in fetchEntry
    cmt_err_msg = eval(cmt_soup_uni_removeHtmlTag)
  File "<string>", line 1, in <module>
NameError: name 'null' is not defined

【解决过程】

1. 网上找了半天,只是看到很多解释,说是最好有节制的使用,尽量少用eval函数,其好像存在一些安全隐患。

推荐使用ast模块。但是ast是python 2.6中才有,而我装得正好只是python 2.5,暂时不方便重新安装升级为2.6,所以继续折腾,看看eval转换为何会出现这个错误。

2.后来通过google搜索到这个:

Running JSON through Python's eval()? - Stack Overflow

“So, as I'm working with Python 2.4 (i.e. no json module), eval() is ... out by SilentGhost: eval doesn't handle true -> True, false -> False, null -> None correctly. ... line 1, in <module> NameError: name 'false' is not defined ”

其中,注意到其解释说,eval不支持null,true,false等,没法正确转换为None,True,False等,所以,才明白,此处的错误,是由于上面的字符串中,包含了“title”:null,eval函数无法正确解析,所以报错“NameError: name 'null' is not defined”。

知道了这个原因后,那就明白了,没法继续再用eval了,只有想办法升级python到2.6+的版本了,然后用

ast.literal_eval

去取代eval,即可。

3。刚又找到官方的解释:

http://docs.python.org/library/functions.html#eval

 eval(expression[, globals[, locals]])?

The arguments are a string and optional globals and locals. If provided,globals must be a dictionary. If provided, locals can be any mapping object.

Changed in version 2.4: formerly locals was required to be a dictionary.

The expression argument is parsed and evaluated as a Python expression (technically speaking, a condition list) using the globals and localsdictionaries as global and local namespace. If the globals dictionary is present and lacks ‘__builtins__’, the current globals are copied into globalsbefore expression is parsed. This means that expressionnormally has full access to the standard __builtin__ module and restricted environments are propagated. If the locals dictionary is omitted it defaults to theglobalsdictionary. If both dictionaries are omitted, the expression is executed in the environment where eval() is called. The return value is the result of the evaluated expression. Syntax errors are reported as exceptions. Example:

>>>

>>> x = 1 >>> print eval('x+1') 2 

This function can also be used to execute arbitrary code objects (such as those created by compile()). In this case pass a code object instead of a string. If the code object has been compiled with 'exec' as themode argument, eval()‘s return value will be None.

Hints: dynamic execution of statements is supported by the execstatement. Execution of statements from a file is supported by theexecfile() function. The globals() andlocals() functions returns the current global and local dictionary, respectively, which may be useful to pass around for use by eval() or execfile().

See ast.literal_eval() for a function that can safely evaluate strings with expressions containing only literals.

【总结】

(1)以后安装python尽量装python的新版本,至少是>=2.6,因为其支持ast模块。

(2)以后尽量少用eval函数,用ast.literal_eval取代eval。

(3)关于ast.literal_eval的解释,详情参见:http://docs.python.org/library/ast.html#ast.literal_eval


【后记 2011-12-20】

后来的经验,证明上述结论,是不准确的。

实际情况是,在用ast.literal_eval的时候,遇到很多字典形式的字符串,转换为字典的时候,结果都会出错,但是用eval,却是可以正常解析的。

而对于null没有定义的问题,不论是ast.literal_eval和eval,两者都不支持的,因为本身python不支持null,python中的变量“空”,不是null,也不是NULL,而是None。所以,一个解决办法是,定义一个全局变量:

null = '' #因为此处处理的是字符,所以此处定义为空字符串

然后在函数里面,加上

global null

然后再去调用eval,就可以正常使用了。

实际证明,至少此处我遇到的,eval处理很多字典类字符串转换为字典变量的时候,还是很好用的。

【结论 2011-12-20】

1.将字典形式字符串转换为字典变量的时候,eval比ast.literal_eval更好用。

2.eval和ast.literal_eval,都不支持null。可以通过,在全局定义一个 null='',在函数内加上global null,以解决此问题。

转自:http://againinput4.blog.163.com/blog/static/172799491201111143108624/?suggestedreading&wumii

python]用eval强制将字符串转换为字典变量时候出错:NameError: name 'null' is not defined[python]用eval函数 字符串转dict的更多相关文章

  1. Python 字符串转换为字典(String to Dict)

    一.需求 为了处理从redis中拿到的value,如下 {"appId":"ct","crawlSts":false,"healt ...

  2. Python中 字符串 转换为 字典

    需求:把以下字符串转换为字典 #字符串 testStr = '{ "pName": "Ceshi", "gender": 1, " ...

  3. python3 内置方法 字符串转换为字典

    内置方法:eval()将字符串转换为字典代码: str = '''{'backend':'www.oldboy.org', 'record':{ 'server':'122.111.2.23', 'w ...

  4. python 将字符串转换为字典

    在一般的工程处理中,需要将获取的字符串数据转换为字典,这样处理起来会非常方便. 我获取的是json数据: content = {"corpus_no":"64702772 ...

  5. 字符串转换为字典的函数eval(字符串)

    首先把多行的字符串,变成一个字符串,用'''和'''扩起来: 然后把这个字符串,赋值给b 这个时候,b根本调不出来,也用不起来: 用eval(b),来格式化字符串变成字典: 然后b就变成了一个字典:

  6. 关于使用json 字符串转换为字典问题

    问题背景: '{"backend": "www.baidu.org", "record": {"server": &qu ...

  7. python json格式字符串转换为字典格式

    不废话,看代码 #_*_ coding:utf- _*_ import os import json course=open('C:\\Users\\ly199\\Desktop\\list.txt' ...

  8. shell将字符串转换为大写变量并将小写作为变量值

    group_name='a b c d e f g' for a in $group_name; do typeset -u a ; echo "$a='$(echo $a | tr '[A ...

  9. Python使用eval强制转换字符串为字典时报错:File "<string>", line 1, in <module> NameError: name 'nan' is not defined

    文本中保存的内容为: { 'QQQ': [0.067, 0.167, 0.2, 0.033, 0.233, 0.267, 0.1, 0.133], 'TTT': [0.5, 0.375, 0.25, ...

随机推荐

  1. Java基础—内部类

    在Java语言中,可以把一个类定义到另一个类的内部,在类里面的这个类就叫作内部类,外面的类叫作外部类.在这种情况下,这个内部类可以被看成外部类的是一个成员(与类的属性和方法类似).还有一种类被称为顶层 ...

  2. js中this关键字的作用

    this中的几种情况 1.普通函数中的this window 2.构造函数中的this 是当前构造函数创建的对象在new这个构造函数的时候会在内存中创建一个对象,此时会让this指向刚创建好的这个对象 ...

  3. 澄清Fundebug录屏技术的几点误会

    1. "视频"并非真的视频.也不是通过连续播放大量截图来实现 首先请大家观看这个视频: 视频中,当鼠标点击"场景重现",会立即播放一段"视频" ...

  4. Phoenix 无法启动报错: java.net.BindException: Address already in use

    一.问题描述 i. 登录Ambari发现有一个节点的 Phoenix 无法启动 ii. 在Ambari上点击“Start”,监控 Phoenix 日志文件 iii. Phoenix 日志如下: [ro ...

  5. 07.进程管理+作业控制+文件查找与压缩+文件压缩与打包+tar打包解包+NFS

    进程管理 程序放在磁盘上叫文件,把它复制到内存,并在cpu运行,就叫进程, 进程多少也反映当前运行程序的多少 进程在系统中会为每个进程生成一个进程号,在所有的进程中有一个特殊进程即init进程, 它是 ...

  6. 201871010136—赵艳强《面向对象程序设计(java)》第十三周学习总结

    201871010136—赵艳强<面向对象程序设计(java)>第十三周学习总结   博文正文开头格式:(2分) 项目 内容 <面向对象程序设计(java)> https:// ...

  7. web-天下武功唯快不破

    没有武术是不可摧毁的,而最快的速度是获得长期成功的唯一途径.>>>>>> ----你必须尽可能快地做到这一点!---- <<<<<&l ...

  8. 第七周scrum会议

    本周会议地点依旧 会议照片: 本周内容: 讨论了进行中的难点 我们正在分析图书馆首页的网页结构以及各种跳转的请求以及链接,为爬虫的实现奠定基础. flask框架我们也遇到了很多问题,正在进行官方文档的 ...

  9. WordPress自定义查询WP_Query使用方法大全

    自定义调用文章在网站建设中很常用,wordpress也很人性化,用新建查询new WP_Query就能实现相关功能.WP_Query怎么用呢?随ytkah一起来看看吧 我们知道wordpress的主循 ...

  10. OpenStack产品摘要

    docs OpenStack 核心服务 计算 Nova:虚拟化设施资源管理 ZUN:容器管理 QINLING:Serveless Function 裸金属 IRONIC:裸金属资源管理 CYBORDF ...