python 使用eval报错NameError: name ‘null’ is not defined
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 使用eval报错NameError: name ‘null’ is not defined相关的知识,希望对你有一定的参考价值。
参考技术A eval()函数十分强大,它可以把list,tuple,dict和string相互转化。项目中用到了eval,使用eval将string转化成dict。其中有一组数据在转化时报错:NameError: name ‘null’ is not defined
经过排查,发现string数据中包含‘null’,在转换时就会报上面的错误
下面介绍一下在数据转换中,json与eval的区别:
1、json.loads与eval都能将s转成python中的对象,json.loads将json中的字符串转成unicode(types.UnicodeType),eval转成了str(types.StringType)。
2、json不认单引号,json中的字符串需要用双引号包起来
pyspark:rdd.foreach(print)报错NameError
目录
报错原因
应该是pyspark低里自带一个Python2版本,可以通升级pyspark自带的python版本来解决
除了rdd.foreach(print)报错NameError还有一个表现就是:
当使用rdd.collect()时,会出现不正常的u字母
[(u'DataStructure', 5), (u'Music', 1), (u'Algorithm', 5), (u'DataBase', 5)]
如何查看是不是这个错误
在启动的时候可以看到你的python版本
上图的python版本就是python 2.7.5
简便解决方法
每次启动pyspark时,先输入一条语句(from __future__ import print_function)即可
from __future__ import print_function
彻底解决方法
1.安装python3
参考链接:centos安装python3详细教程_知行合一-CSDN博客_centos安装python3
如果要用的3.0以上的版本需要手动安装,下载地址:https://www.python.org/ftp/python/
(1)先查看系统python的位置在哪儿
whereis python
python2.7默认安装是在 /usr/bin目录中,切换到/usr/bin/
cd /usr/bin/
查看有关python的文件的详细信息
ll python*
从下面的图中可以看出,python指向的是python2,python2指向的是python2.7,因此我们可以装个python3,然后将python指向python3,然后python2指向python2.7,那么两个版本的python就能共存了
(2)下载python3的包之前,要先安装相关的依赖包,用于下载编译python3
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
运行了以上命令以后,就安装了编译python3所用到的相关依赖
(3)默认的centos7是没有安装pip,先添加epel扩展源
yum -y install epel-release
(4)安装pip
yum install python-pip
(5)安装wget
yum -y install wget
(6)用wget下载python3的源码包,或者自己先下载好,上传到服务器再安装,如果网络快可以直接安装
wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
(7)编译python3源码包,解压
xz -d Python-3.6.8.tar.xz
tar -xf Python-3.6.8.tar
(8)进入解压后的目录,依次执行下面命令进行手动编译
cd Python-3.6.8
./configure prefix=/usr/local/python3
make && make install
(9)安装依赖zlib、zlib-deve
yum install zlib zlib
yum install zlib zlib-devel
(10)最后没提示出错,就代表正确安装了,在/usr/local/目录下就会有python3目录
(11)添加软链接,将原来的链接备份
mv /usr/bin/python /usr/bin/python.bak
(12)添加python3的软链接
ln -s /usr/local/bin/python3.6 /usr/bin/python
(13)测试是否安装成功
python -V
(14)更改yum配置,因为其要用到python2才能执行,否则会导致yum不能正常使用
vi /usr/bin/yum
(15)把第一行的#! /usr/bin/python 修改为如下
#! /usr/bin/python2
(16)还有一个地方也需要修改
vi /usr/libexec/urlgrabber-ext-down
(17)把第一行的#! /usr/bin/python 修改如下
#! /usr/bin/python2
(18)启动python2
python2
(19)启动python3
python
改好之后的链接
2.pyspark设置python版本
参考链接:pyspark设置python的版本_abc_321a的博客-CSDN博客_spark指定python版本
(1)修改spark-env.sh文件,在末尾添加export PYSPARK_PYTHON=/usr/local/bin/python3.6
cd /home/hadoop/softs/spark-2.4.7/conf //spark-env.sh文件在该目录下
(2)修改spark安装包bin目录下的pyspark
cd /home/hadoop/softs/spark-2.4.7/bin
vi pyspark
修改如图两个位置,将原来的python改成python3,如下图
(3)启动pyspark可以看到python版本变了
3.执行语句测试应该就不会报错了
如有侵权,联系删除
以上是关于python 使用eval报错NameError: name ‘null’ is not defined的主要内容,如果未能解决你的问题,请参考以下文章
eval报错NameError: name 'null' is not defined
我写了一个python程序,报错NameError: name XX is not defined 求解
pyspark:rdd.foreach(print)报错NameError
Python:导入KMeans库失败;Kmeans报错及解决方法;NameError: name ‘KMeans‘ is not defined
Python3启动django项目报错“NameError: name '_mysql' is not defined”