一、eval()
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
eval(expression[, globals[, locals]])
参数
os.path
expression – 表达式。
globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals –变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
字符串与list、tuple、dict的转化
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
b = eval(a)
b
Out[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
type(b)
Out[4]: list
a = "{1: 'a', 2: 'b'}"
b = eval(a)
b
Out[7]: {1: 'a', 2: 'b'}
type(b)
Out[8]: dict
a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
b = eval(a)
b
Out[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
给个字符串给eval,eval给你一个表达式返回值
- 传递globals参数值为{“age”:1822}
eval("{'name':'linux','age':age}",{"age":1822})
输出结果:{‘name’: ‘linux’, ‘age’: 1822}
再加上locals变量
age=18
eval("{'name':'linux','age':age}",{"age":1822},locals())
输出
{'age': 18, 'name': 'linux'}
根据上面两个例子可以看到当locals参数为空,globals参数不为空时,查找globals参数中是否存在变量,并计算。
当两个参数都不为空时,先查找locals参数,再查找globals参数,locals参数中同名变量会覆盖globals中的变量。
二、危险之处
eval虽然方便,但是要注意安全性,可以将字符串转成表达式并执行,就可以利用执行系统命令,删除文件等操作。
假设用户恶意输入。比如
eval("__import__('os').system('ls /Users/chunming.liu/Downloads/')")
那么eval()之后,你会发现,当前文件夹文件都会展如今用户前面。这句其实相当于执行了
os.system('ls /Users/chunming.liu/Downloads/')
那么继续输入:
eval("__import__('os').system('cat /Users/chunming.liu/Downloads/tls_asimov_cert.pem')")
代码都给人看了。
再来一条删除命令,文件消失。比如
eval("__import__('os').system('rm /Users/chunming.liu/Downloads/车辆转发测试.png')")
三、 os.path.join
连接两个或更多的路径名组件
1.如果各组件名首字母不包含’/’,则函数会自动加上
2.第一个以”/”开头的参数开始拼接,之前的参数全部丢弃,当有多个时,从最后一个开始
3.如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾
print(“2:”,os.path.join(’/aaaa’,’/bbbb’,’/ccccc.txt’)) #不良写法习惯
2: /ccccc.txt
print(“22:”,os.path.join(’/aaaa/’,‘bbbb/’,‘ccccc.txt’)) #通常可以这样写
22: aaaa/bbb/ccccc.txt
print(“1:”,os.path.join(‘aaaa’,’/bbbb’,‘ccccc.txt’))
#以字符串中含有 / 的第一个开始拼接:
1: /bbbb/ccccc.txt
os.path.exists()
os.path模块主要用于文件的属性获取,exists是“存在”的意思,所以顾名思义,os.path.exists()就是判断括号里的文件是否存在的意思,括号内的可以是文件路径。
如果不存在,返回的则是FALSE
举例如下:
Finalpath = os.path.join(CertificateRootPath,'c6',NfvoIp)
if not os.path.exists(Finalpath):
os.mkdir(Finalpath)
之前网上查找os.path.isdir()和os.path.isfile()的使用;发现很多是错误的,主要原因是,传入的参数不是绝对路径。
os.listdir()方法,此方法返回一个列表,其中包含有指定路径下的目录和文件的名称
import os
dirct = '/home/vnfm/vnfm-develop/'
for i in os.listdir(dirct):
print(i)
['vnfm', 'vnfm-env']
os.path.isdir()和os.path.isfile()需要传入的参数是绝对路径
,但是os.listdir()返回的只是一个某个路径下的文件和列表的名称.
常见错误:直接使用os.listdir()的返回值当做os.path.isdir()和os.path.isfile()的入参
正确用法:需要先使用python路径拼接os.path.join()函数,将os.listdir()返回的名称拼接成文件或目录的绝对路径再传入os.path.isdir()和os.path.isfile().
os.path.join()用法:
import os
dirct = '/home/vnfm/vnfm-develop/'
for i in os.listdir(dirct):
fulldirct = os.path.join(dirct,i)
print(fulldirct)
/home/vnfm/vnfm-develop/vnfm
/home/vnfm/vnfm-develop/vnfm-env
os.path.isdir()用于判断某一对象(需提供绝对路径)是否为目录
import os
dirct = '/home/vnfm/vnfm-develop/vnfm/'
for i in os.listdir(dirct):
fulldirct = os.path.join(dirct, i)
if os.path.isdir(fulldirct):
print(i)
.git
documents
policy
vnfm
vnfd
os.path.isfile()用于判断某一对象(需提供绝对路径)是否为文件
import os
dirct = '/home/vnfm/vnfm-develop/vnfm/'
for i in os.listdir(dirct):
fulldirct = os.path.join(dirct, i)
if os.path.isfile(fulldirct):
print(i)
entrypoint.sh
upgrade_vnfm.sh
如果该目录下有文件,打印出文件名
os.path.abspath(path) 返回绝对路径
shutil.rmtree() 表示递归删除文件夹下的所有子文件夹和子文件
。
因此如果想删除E盘下某个文件夹,可以用
shutil.rmtree('E:\\myPython\\image-filter\\test', ignore_errors=True)
这样 test 文件夹内的所有文件(包括 test 本身)都会被删除,并且忽略错误。
四、 request.files.get
file_obj = request.files.get(‘file’) 的方式获取文件对象
返回值 file_obj 是一个文件对象,但是我们平常在使用时通常是在open() 函数中指定打开方式的,可是这里并不知道这个文件对象中的数据是何种编码方式,因此就会出现中文乱码的问题
解决方法:
先从文件对象中将内容读出,然后再按照我们想要的格式解码(通常 utf-8)。
file_obj = request.files.get('file')
file_content = file_obj.read()
file_content = file_content.decode("utf-8")
print('答案内容为:', file_content)
request中的files属性,,,记录请求上传的文件
已上传的文件存储在内存或是文件系统中一个临时的位置。你可以通过请求对象的 files 属性访问它们。
每个上传的文件都会存储在这个字典里。它表现近乎为一个标准的 Python file 对象,
但它还有一个
save() 方法,这个方法允许你把文件保存到服务器的文件系统上
。
例如:
if request.files.get('ca_cert'):
request_data = request.files.get('ca_cert')
request_data.save(Finalpath+'/ca.cert')
例子2:
from flask import Flask, request
app = Flask(__name__)
'''因为是文件,所以只能是POST方式'''
@app.route("/upload", methods=["POST"])
def upload():
"""接受前端传送来的文件"""
file_obj = request.files.get("pic")
if file_obj is None:
# 表示没有发送文件
return "未上传文件"
'''
将文件保存到本地(即当前目录)
直接使用上传的文件对象保存
'''
file_obj.save('pic.jpg') # 和前端上传的文件类型要相同
return "上传成功"
# 将文件保存到本地(即当前目录) 普通的保存方法
# with open("./pic.jpg",'wb') as f:
# data = file_obj.read()
# f.write(data)
# return "上传成功"
if __name__ == '__main__':
app.run(debug=True)
request方法扩展请点击
这个链接
关于make_response响应、redirect跳转,请点击
Flask中request请求、make_response响应、redirect跳转
五、re.findall(pattern, text)(关键词:python/正则表达式/re)
findall(pattern, text)函数会返回输入中与模式匹配而不重叠的所有子串
import re
text = 'abbaaabbbbaaaaa'
pattern = 'ab'
for match in re.findall(pattern, text):
print 'Found "%s"' % match
输出:
Found “ab”
Found “ab”
import re
kk = re.compile(r'\d+')
kk.findall('one1two2three3four4')
#[1,2,3,4]
#注意此处findall()的用法,可传两个参数;
kk = re.compile(r'\d+')
re.findall(kk,"one123")
#[1,2,3]
从compile()函数的定义中,可以看出返回的是一个匹配对象,它单独使用就没有任何意义,需要和findall(), search(), match()搭配使用。
compile()与findall()一起使用,返回一个列表。
compile()与match()一起使用,可返回一个class、str、tuple。但是一定需要注意match(),从位置0开始匹配,匹配不到会返回None,返回None的时候就没有span/group属性了,并且与group使用,返回一个单词‘Hello’后匹配就会结束。
compile()与search()搭配使用, 返回的类型与match()差不多, 但是不同的是search(), 可以不从位置0开始匹配。但是匹配一个单词之后,匹配和match()一样,匹配就会结束。
\s表示空格
\w表示任何字符,包括字母数字下划线
_就表示下划线
\s – 匹配任何不可见字符,包括空格、制表符、换页符等等
\S – 匹配任何可见字符 通常[/s/S] – 可匹配任意字符
[\s\S]*? – 匹配懒惰模式的任意字符
详情:
查看相关区别
正则表达式有括号时 可能遇到得坑 ,请点击
Python 正则re模块之findall()详解
六、替换函数replace()
Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
str.replace(old, new[, max])
返回字符串中的 old(旧字符串) 替换成 new(新字符串)后生成的新字符串,如果指定第三个参数max,则替换不超过 max 次
str = "this is string example....wow!!! this is really string";
print str.replace("is", "was");
print str.replace("is", "was", 3);
if '[' in VimIp:
VimIp = VimIp.replace('[','').replace(']','')
七、