shutil

高级的文件、文件夹、压缩包 处理模块

  1. shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中
  2.  
  3. import shutil
  4. shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
  5.  
  6. shutil.copyfile(src, dst) 拷贝文件
  7. shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在
  8.  
  9. shutil.copymode(src, dst) 仅拷贝权限。内容、组、用户均不变
  10. shutil.copymode('f1.log', 'f2.log') #目标文件必须存在
  11.  
  12. shutil.copystat(src, dst) 仅拷贝状态的信息,包括:mode bits, atime, mtime, flags
  13.  
  14. shutil.copystat('f1.log', 'f2.log') #目标文件必须存在
  15.  
  16. shutil.copy(src, dst) 拷贝文件和权限
  17.  
  18. import shutil
  19. shutil.copy('f1.log', 'f2.log')
  20.  
  21. shutil.copy2(src, dst) 拷贝文件和状态信息
  22.  
  23. import shutil
  24.  
  25. shutil.copy2('f1.log', 'f2.log')
  26.  
  27. shutil.ignore_patterns(*patterns)
  28. shutil.copytree(src, dst, symlinks=False, ignore=None)
  29. 递归的去拷贝文件夹
  30.  
  31. import shutil
  32. shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除
  33.  
  34. import shutil
  35. shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
  36.  
  37. '''
  38. 通常的拷贝都把软连接拷贝成硬链接,即对待软连接来说,创建新的文件
  39. '''
  40.  
  41. shutil.rmtree(path[, ignore_errors[, onerror]])
  42. 递归的去删除文件
  43.  
  44. import shutil
  45. shutil.rmtree('folder1')
  46.  
  47. shutil.move(src, dst)
  48. 递归的去移动文件,它类似mv命令,其实就是重命名。
  49. shutil.move('folder1', 'folder3')
  50.  
  51. shutil.make_archive(base_name, format,...)
  52. 创建压缩包并返回文件路径,例如:ziptar
  53. 创建压缩包并返回文件路径,例如:ziptar
  54.  
  55. base_name 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
  56. data_bak =>保存至当前路径
  57. 如:/tmp/data_bak =>保存至/tmp/
  58. format 压缩包种类,“zip”, tar”, bztar”,“gztar
  59. root_dir 要压缩的文件夹路径(默认当前目录)
  60. owner 用户,默认当前用户
  61. group 组,默认当前组
  62. logger 用于记录日志,通常是logging.Logger对象
  63.  
  64. /data 下的文件打包放置当前程序目录
  65. import shutil
  66. ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data')
  67.  
  68. /data下的文件打包放置 /tmp/目录
  69. import shutil
  70. ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data')
  71.  
  72. shutil直接解压
  73. shutil.unpack_archive("1111.zip")

shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的

  1. import zipfile
  2. #压缩
  3. z=zipfile.ZipFile('laxi.zip','w') #在当前目录下建立一个名为laxi的空压缩包(已经存在的话就以写入模式打开)
  4. z.write('uesr_data.json') #讲一个名为uesr_data.json的文件写入压缩包中
  5. z.close()
  6. #解压
  7. z=zipfile.ZipFile("laxi.zip","r")
  8. z.extractall(path=".") #解压路径为当前路径
  9. z.close()

zipfile压缩解压

  1. import tarfile
  2. # 压缩
  3. t=tarfile.open(r'F:\代码练习\uesr_data.json','w')
  4. t.add('/test1/a.py',arcname='a.bak') #arcname指定存档文件中文件的替代名称。
  5. t.add('/test1/b.py',arcname='b.bak')
  6. t.close()
  7.  
  8. #解压
  9. t=tarfile.open('/tmp/egon.tar','r')
  10. t.extractall('/egon')
  11. t.close()

tarfile压缩解压

json与pickle

什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化

为什么不用eval反序列化

  1. 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loadseval都能用,但遇到特殊类型的时候,eval就不管用了,所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值,
  2.  
  3. eval()函数十分强大,但是eval是做什么的?eval官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。强大的函数有代价。安全性是其最大的缺点。
  4. 想象一下,如果我们从文件中读出的不是一个数据结构,而是一句"删除文件"类似的破坏性语句,那么后果实在不堪设设想。
  5. 而使用eval就要担这个风险。
  6. 所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)

序列化的目的

  1. 1,持久保存状态
  2. 2,跨平台数据交互

json

如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。

JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:

  1. js 中的数据类型 python数据类型 的对应关系
  2. {} 字典
  3. [] list
  4. string "" str python里面单引号和双引号都可以,js里面只能是双引号
  5. int/float int/float
  6. true/false True/False
  7. null None

json格式的语法规范:
最外层通常是一个字典或列表
{} or []
只要你想写一个json格式的数据 那么最外层直接写{}
字符串必须是双引号
你可以在里面套任意多的层次

json模块的核心功能      dump    dumps    load     loads       不带s封装write 和 read,但须要一个文件句柄

  1. import json
  2. dic = {'k1':'v1','k2':'v2','k3':'v3'}
  3. str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串
  4. print(type(str_dic),str_dic) #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
  5. #注意,json转换完的字符串类型的字典中的字符串是由""表示的
  6.  
  7. dic2 = json.loads(str_dic) #反序列化:将一个字符串格式的字典转换成一个字典
  8. #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
  9. print(type(dic2),dic2) #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
  10.  
  11. list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
  12. str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型
  13. print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
  14. list_dic2 = json.loads(str_dic)
  15. print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]

loads与dumps

  1. import json
  2. f = open('json_file','w')
  3. dic = {'k1':'v1','k2':'v2','k3':'v3'}
  4. json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
  5. f.close()
  6.  
  7. f = open('json_file')
  8. dic2 = json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
  9. f.close()
  10. print(type(dic2),dic2)

load与dump

  1. import json
  2. f = open('file','w')
  3. json.dump({'国籍':'中国'},f)
  4. ret = json.dumps({'国籍':'中国'})
  5. f.write(ret+'\n')
  6. json.dump({'国籍':'美国'},f,ensure_ascii=False)
  7. ret = json.dumps({'国籍':'美国'},ensure_ascii=False)
  8. f.write(ret+'\n')
  9. f.close()

ensure_ascii关键字参数

  1. Serialize obj to a JSON formatted str.(字符串表示的json对象)
  2. Skipkeys:默认值是False,如果dictkeys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
  3. ensure_ascii:,当它为True的时候,所有非ASCII码字符显示为\uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。)
  4. If check_circular is false, then the circular reference check for container types will be skipped and a circular reference will result in an OverflowError (or worse).
  5. If allow_nan is false, then it will be a ValueError to serialize out of range float values (nan, inf, -inf) in strict compliance of the JSON specification, instead of using the JavaScript equivalents (NaN, Infinity, -Infinity).
  6. indent:应该是一个非负的整型,如果是0就是顶格分行显示,如果为空就是一行最紧凑显示,否则会换行且按照indent的数值显示前面的空白分行显示,这样打印出来的json数据也叫pretty-printed json
  7. separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionarykeys之间用“,”隔开,而KEYvalue之间用“:”隔开。
  8. default(obj) is a function that should return a serializable version of obj or raise TypeError. The default simply raises TypeError.
  9. sort_keys:将数据根据keys的值进行排序。
  10. To use a custom JSONEncoder subclass (e.g. one that overrides the .default() method to serialize additional types), specify it with the cls kwarg; otherwise JSONEncoder is used.

其他参数说明

  1. import json
  2. data = {'username':['李华','二愣子'],'sex':'male','age':16}
  3. json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False)
  4. print(json_dic2)

json格式化输出

pickle

pickle模块主要功能   dump   load    dumps   loads
dump是序列化  load反序列化
不带s的是帮你封装write read 更方便

load函数可以多次执行 每次load 都是往后在读一个对象 如果没有了就抛出异常Ran out of input

  1. import pickle
  2. # 用户注册后得到的数据
  3. name = "高跟"
  4. password = ""
  5. height = 1.5
  6. hobby = ["吃","喝","赌","飘",{1,2,3}]
  7.  
  8. with open("userdb.txt","wt",encoding="utf-8") as f:
  9. text = "|".join([name,password,str(height)])
  10. f.write(text)
  11.  
  12. pickle支持python中所有的数据类型
  13. user = {"name":name,"password":password,"height":height,"hobby":hobby,"test":3}
  14.  
  15. 序列化的过程
  16. with open("userdb.pkl","ab") as f:
  17. userbytes = pickle.dumps(user)
  18. f.write(userbytes)
  19.  
  20. 反序列化过程
  21. with open("userdb.pkl","rb") as f:
  22. userbytes = f.read()
  23. user = pickle.loads(userbytes)
  24. print(user)
  25. print(type(user))
  26.  
  27. dump 直接序列化到文件
  28. with open("userdb.pkl","ab") as f:
  29. pickle.dump(user,f)
  30.  
  31. load 从文件反序列化
  32. with open("userdb.pkl","rb") as f:
  33. user = pickle.load(f)
  34. print(user)
  35. print(pickle.load(f))
  36. print(pickle.load(f))
  37. print(pickle.load(f))

pickle

如果我们将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用,但是如果我们用pickle进行序列化,其他语言就不能读

shelve

也用于序列化,它与pickle的不同之处在于 ,不需要关心文件模式什么的 类似把它当成一个字典来看待,它可以直接对数据进行修改 而不用覆盖原来的数据,而pickle 你想要修改只能 用wb模式来覆盖

  1. import shelve
  2. user = {"name":"高根"}
  3. s = shelve.open("userdb.shv")
  4. s["user"] = user
  5. s.close()
  6.  
  7. s = shelve.open("userdb.shv",writeback=True)
  8. print(s["user"])
  9. s["user"]["age"] = 20
  10. s.close()

xml

xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过在json还没诞生前,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。

  1. import xml.etree.ElementTree as ElementTree (这个另起一个名字随意,看着舒服就行)
  2.  
  3. 解析d.xml
  4.  
  5. tree = ElementTree.parse("d.xml")
  6. print(tree)
  7.  
  8. 获取根标签
  9. rootTree = tree.getroot()
  10.  
  11. 三种获取标签的方式
  12. 获取所有人的年龄 iter是用于在全文范围获取标签
  13. for item in rootTree.iter("age"):
  14. # 一个标签三个组成部分
  15. print(item.tag) # 标签名称
  16. print(item.attrib) # 标签的属性
  17. print(item.text) # 文本内容
  18.  
  19. 第二种 从当前标签的子标签中找到一个名称为age的标签 如果有多个 找到的是第一个
  20. print(rootTree.find("age").attrib)
  21.  
  22. 第三种 从当前标签的子标签中找到所有名称为age的标签
  23. print(rootTree.findall("age"))
  24.  
  25. 获取单个属性
  26. stu = rootTree.find("stu")
  27. print(stu.get("age"))
  28. print(stu.get("name"))
  29.  
  30. 删除子标签
  31. rootTree.remove(stu)
  32.  
  33. 添加子标签
  34. 要先创建一个子标签
  35. newTag = ElementTree.Element("这是新标签",{"一个属性":"值"})
  36. rootTree.append(newTag)
  37.  
  38. 另外,节点还有set(设置节点属性)
  39.  
  40. 写入文件
  41. tree.write("f.xml",encoding="utf-8")
  1. import xml.etree.ElementTree as ET
  2.  
  3. new_xml = ET.Element("namelist")
  4. name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
  5. age = ET.SubElement(name,"age",attrib={"checked":"no"})
  6. sex = ET.SubElement(name,"sex")
  7. sex.text = ''
  8. name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
  9. age = ET.SubElement(name2,"age")
  10. age.text = ''
  11.  
  12. et = ET.ElementTree(new_xml) #生成文档对象
  13. et.write("test.xml", encoding="utf-8",xml_declaration=True)
  14.  
  15. ET.dump(new_xml) #打印生成的格式

自己创建xml文档

  1. ElementTree生来就是为了处理XML,它在Python标准库中有两种实现:一种是纯Python实现的,如xml.etree.ElementTree,另一种是速度快一点的xml.etree.cElementTree。注意:尽量使用C语言实现的那种,因为它速度更快,而且消耗的内存更少。
  2.   a. 遍历根节点的下一层   
  3.   b. 下标访问各个标签、属性、文本
  4.   c. 查找root下的指定标签
  5.   d. 遍历XML文件
  6.   e. 修改XML文件
  7.  
  8. #coding=utf-8
  9.  
  10. #通过解析xml文件
  11. '''
  12. try:
  13. import xml.etree.CElementTree as ET
  14. except:
  15. import xml.etree.ElementTree as ET
  16.  
  17. 从Python3.3开始ElementTree模块会自动寻找可用的C库来加快速度
  18. '''
  19. import xml.etree.ElementTree as ET
  20. import os
  21. import sys
  22. '''
  23. XML文件读取
  24. <?xml version="1.0" encoding="utf-8"?>
  25. <catalog>
  26. <maxid>4</maxid>
  27. <login username="pytest" passwd='123456'>dasdas
  28. <caption>Python</caption>
  29. <item id="4">
  30. <caption>测试</caption>
  31. </item>
  32. </login>
  33. <item id="2">
  34. <caption>Zope</caption>
  35. </item>
  36. </catalog>
  37. '''
  38.  
  39. #遍历xml文件
  40. def traverseXml(element):
  41. #print (len(element))
  42. if len(element)>0:
  43. for child in element:
  44. print (child.tag, "----", child.attrib)
  45. traverseXml(child)
  46. #else:
  47. #print (element.tag, "----", element.attrib)
  48.  
  49. if __name__ == "__main__":
  50. xmlFilePath = os.path.abspath("test.xml")
  51. print(xmlFilePath)
  52. try:
  53. tree = ET.parse(xmlFilePath)
  54. print ("tree type:", type(tree))
  55.  
  56. # 获得根节点
  57. root = tree.getroot()
  58. except Exception as e: #捕获除与程序退出sys.exit()相关之外的所有异常
  59. print ("parse test.xml fail!")
  60. sys.exit()
  61. print ("root type:", type(root))
  62. print (root.tag, "----", root.attrib)
  63.  
  64. #遍历root的下一层
  65. for child in root:
  66. print ("遍历root的下一层", child.tag, "----", child.attrib)
  67.  
  68. #使用下标访问
  69. print (root[0].text)
  70. print (root[1][1][0].text)
  71.  
  72. print (20 * "*")
  73. #遍历xml文件
  74. traverseXml(root)
  75. print (20 * "*")
  76.  
  77. #根据标签名查找root下的所有标签
  78. captionList = root.findall("item") #在当前指定目录下遍历
  79. print (len(captionList))
  80. for caption in captionList:
  81. print (caption.tag, "----", caption.attrib, "----", caption.text)
  82.  
  83. #修改xml文件,将passwd修改为999999
  84. login = root.find("login")
  85. passwdValue = login.get("passwd")
  86. print ("not modify passwd:", passwdValue)
  87. login.set("passwd", "") #修改,若修改text则表示为login.text
  88. print ("modify passwd:", login.get("passwd"))

处理xml文件

configparser

该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。

  1. [db]
  2. db_port = 3306
  3. db_user = root
  4. db_host = 127.0.0.1
  5. db_pass = xgmtest
  6.  
  7. [concurrent]
  8. processor = 20
  9. thread = 10
  1. import configparser
  2.  
  3. config=configparser.ConfigParser()
  4. config.read('a.cfg')
  5.  
  6. #查看所有的标题
  7. res=config.sections() #['section1', 'section2']
  8. print(res)
  9.  
  10. #查看标题section1下所有key=value的key
  11. options=config.options('section1')
  12. print(options) #['k1', 'k2', 'user', 'age', 'is_admin', 'salary']
  13.  
  14. #查看标题section1下所有key=value的(key,value)格式
  15. item_list=config.items('section1')
  16. print(item_list) #[('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')]
  17.  
  18. #查看标题section1下user的值=>字符串格式
  19. val=config.get('section1','user')
  20. print(val) #egon
  21.  
  22. #查看标题section1下age的值=>整数格式
  23. val1=config.getint('section1','age')
  24. print(val1) #
  25.  
  26. #查看标题section1下is_admin的值=>布尔值格式
  27. val2=config.getboolean('section1','is_admin')
  28. print(val2) #True

读取

  1. import configparser
  2.  
  3. config=configparser.ConfigParser()
  4. config.read('a.cfg',encoding='utf-8')
  5.  
  6. 删除整个标题section2
  7. config.remove_section('section2')
  8.  
  9. 删除标题section1下的某个k1k2
  10. config.remove_option('section1','k1')
  11. config.remove_option('section1','k2')
  12.  
  13. 判断是否存在某个标题
  14. print(config.has_section('section1'))
  15.  
  16. 判断标题section1下是否有user
  17. print(config.has_option('section1',''))
  18.  
  19. 添加一个标题
  20. config.add_section('egon')
  21.  
  22. 在标题egon下添加name=egon,age=18的配置
  23. config.set('egon','name','egon')
  24. config.set('egon','age',18) #报错,必须是字符串
  25.  
  26. 最后将修改的内容写入文件,完成最终的修改
  27. config.write(open('a.cfg','w'))

修改

常用模块之 shutil,json,pickle,shelve,xml,configparser的更多相关文章

  1. python笔记-7(shutil/json/pickle/shelve/xml/configparser/hashlib模块)

    一.shutil模块--高级的文件.文件夹.压缩包处理模块 1.通过句柄复制内容 shutil.copyfileobj(f1,f2)对文件的复制(通过句柄fdst/fsrc复制文件内容) 源码: Le ...

  2. 常用模块(random,os,json,pickle,shelve)

    常用模块(random,os,json,pickle,shelve) random import random print(random.random()) # 0-1之间的小数 print(rand ...

  3. 模块 - json/pickle/shelve/xml/configparser

    序列化: 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 为什么要序列化: 有种办法可以直接把内存数据(eg:10个列表,3 ...

  4. Python全栈之路----常用模块----序列化(json&pickle&shelve)模块详解

    把内存数据转成字符,叫序列化:把字符转成内存数据类型,叫反序列化. Json模块 Json模块提供了四个功能:序列化:dumps.dump:反序列化:loads.load. import json d ...

  5. Python全栈开发记录_第八篇(模块收尾工作 json & pickle & shelve & xml)

    由于上一篇篇幅较大,留下的这一点内容就想在这里说一下,顺便有个小练习给大家一起玩玩,首先来学习json 和 pickle. 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过, ...

  6. json/pickle/shelve/xml/configparser/hashlib/subprocess - 总结

    序列化:序列化指把内存里的数据类型转成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes为什么要序列化:可以直接把内存数据(eg:10个列表,3个嵌套字典)存到硬盘 ...

  7. 常用模块(json/pickle/shelve/XML)

    一.json模块(重点) 一种跨平台的数据格式 也属于序列化的一种方式 介绍模块之前,三个问题: 序列化是什么? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化. 反序列化又是什么? 将 ...

  8. Python学习笔记——基础篇【第六周】——json & pickle & shelve & xml处理模块

    json & pickle 模块(序列化) json和pickle都是序列化内存数据到文件 json和pickle的区别是: json是所有语言通用的,但是只能序列化最基本的数据类型(字符串. ...

  9. python 序列化及其相关模块(json,pickle,shelve,xml)详解

    什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...

  10. python序列化及其相关模块(json,pickle,shelve,xml)详解

    什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...

随机推荐

  1. 【aws】

    云服务器EC2 动态调整云服务器ec2 cpu.内存大小: 在ec2实例上右键,Instance settings--> Change Instance Type 选择一个合适的type 云数据 ...

  2. Can you answer these queries?---hdu4027

    题目链接 有n个数:当操作为1时求L到R的和: 当操作为0时更新L到R为原来的平方根: 不过如果仔细演算的话会发现一个2^64数的平方根开8次也就变成了 1,所以也更新不了多少次,所以可以每次更新到底 ...

  3. Java非静态内部类为什么不能有静态成员

    我们可以把InnerClass看成OuterClass的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载InnerClass必须在实例化OuterClass之后完成 ,java虚拟机要求所 ...

  4. idong常用js总结

    1.判断屏幕高度 $(document).ready(function() {    $("#left").height($(window).height());    $(&qu ...

  5. openstack 部署笔记--基本环境准备

    基础信息 配置:centos7.3 8G内存 4核处理器  单网卡 控制节点IP:192.168.15.243 计算节点IP:192.168.15.238 openstack 版本:ocata 配置信 ...

  6. [LeetCode] 301. Remove Invalid Parentheses_Hard tag:BFS

    Remove the minimum number of invalid parentheses in order to make the input string valid. Return all ...

  7. webdriver模拟鼠标悬浮

    未经作者允许,禁止转载! 有时候会遇到这样的情况,鼠标停留在某一区域,不需要点击,悬浮在这一区域的上方就会显示该区域的下拉框,如下图 下面将鼠标停留在“日历”和“星座”这两个部分之间来回悬浮,下面是代 ...

  8. Vue.Js添加自定义插件

    基于上篇我们讲了 在window下搭建Vue.Js开发环境 我们可以开发自己的vue.js插件发布到npm上,供大家下载使用. 1.首先打开cmd命令窗口,进入我们的工作目录下 执行 cd E:\vu ...

  9. SpringBoot与Docker1

    1:docker是一个开源的应用容器引擎: docker支持将软件编译成一个镜像:然后再镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像: 运行中的这个镜像称为容器,容器启动是非 ...

  10. Java实现递归将嵌套Map里的字段名由驼峰转为下划线

    摘要: 使用Java语言递归地将Map里的字段名由驼峰转下划线.通过此例可以学习如何递归地解析任意嵌套的List-Map容器结构. 难度:初级 概述 在进行多语言混合编程时,由于编程规范的不同, 有时 ...