天天看点

python常用模块补充

一、random模块

1、random模块用法

1

2

3

4

5

6

7

8

9

10

<code>import</code> <code>random</code>

<code>print</code><code>(random.random())                  </code><code># 打印大于0且小于1之间的一个小数</code>

<code>print</code><code>(random.randint(</code><code>1</code><code>, </code><code>3</code><code>))              </code><code># 打印大于等于1且小于等于3之间的一个整数</code>

<code>print</code><code>(random.randrange(</code><code>1</code><code>, </code><code>3</code><code>))            </code><code># 打印大于等于1且小于3之间的一个整数</code>

<code>print</code><code>(random.choice([</code><code>1</code><code>, </code><code>'23'</code><code>, [</code><code>4</code><code>, </code><code>5</code><code>]]))      </code><code># 结果为1或者23或者[4,5]</code>

<code>print</code><code>(random.sample([</code><code>1</code><code>, </code><code>'23'</code><code>, [</code><code>4</code><code>, </code><code>5</code><code>]], </code><code>2</code><code>))    </code><code># 打印列表元素任意2个组合</code>

<code>print</code><code>(random.uniform(</code><code>1</code><code>, </code><code>3</code><code>))              </code><code># 打印大于1小于3的小数</code>

<code>item </code><code>=</code> <code>[</code><code>1</code><code>, </code><code>3</code><code>, </code><code>5</code><code>, </code><code>7</code><code>, </code><code>9</code><code>]</code>

<code>random.shuffle(item)              </code><code># 打乱item的顺序,相当于"洗牌",如[9, 1, 7, 3, 5]</code>

<code>print</code><code>(item)</code>

2、生成随机验证码

<code>def</code> <code>make_code(n):                     </code><code>#n表示验证码的位数</code>

<code>    </code><code>res</code><code>=</code><code>''</code>

<code>    </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(n):                  </code><code>#传参数,表示生成多少位的验证码</code>

<code>        </code><code>s1</code><code>=</code><code>chr</code><code>(random.randint(</code><code>65</code><code>,</code><code>90</code><code>))      </code><code>#对应ASCII码的数字,再取到对应字母</code>

<code>        </code><code>s2</code><code>=</code><code>str</code><code>(random.randint(</code><code>0</code><code>,</code><code>9</code><code>))        </code><code>#0到9的数字随机取一个</code>

<code>        </code><code>res</code><code>+</code><code>=</code><code>random.choice([s1,s2])        </code><code>#对s1,s2的值进行随机取一个值,取到的字符串不断相加</code>

<code>    </code><code>return</code> <code>res</code>

<code>print</code><code>(make_code(</code><code>9</code><code>))</code>

二、os模块

1、os模块的用法

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

<code>import</code> <code>os</code>

<code>os.getcwd()                         </code><code>#获取当前工作目录,即当前python脚本工作的目录路径</code>

<code>os.chdir(</code><code>"dirname"</code><code>)               </code><code>#改变当前脚本工作目录;切换目录</code>

<code>os.curdir                          </code><code>#返回当前目录: ('.')</code>

<code>os.pardir                          </code><code>#获取当前目录的父目录字符串名:('..')</code>

<code>os.makedirs(</code><code>'dirname1/dirname2'</code><code>)     </code><code>#可生成多层递归目录</code>

<code>os.removedirs(</code><code>'dirname1'</code><code>)         </code><code>#若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推</code>

<code>os.mkdir(</code><code>'dirname'</code><code>)              </code><code>#生成单级目录;</code>

<code>os.rmdir(</code><code>'dirname'</code><code>)              </code><code>#删除单级空目录,若目录不为空则无法删除,报错;</code>

<code>os.listdir(</code><code>'dirname'</code><code>)            </code><code>#列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印</code>

<code>os.remove()                        </code><code>#删除一个文件</code>

<code>os.rename(</code><code>"oldname"</code><code>,</code><code>"newname"</code><code>)    </code><code>#重命名文件/目录</code>

<code>os.stat(</code><code>'path/filename'</code><code>)        </code><code>#获取文件/目录信息</code>

<code>os.sep                            </code><code>#输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"</code>

<code>os.linesep                   </code><code>#输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"</code>

<code>os.pathsep                   </code><code>#输出用于分割文件路径的字符串 win下为分号;,Linux下为冒号:</code>

<code>os.name                      </code><code>#输出字符串指示当前使用平台。win-&gt;'nt'; Linux-&gt;'posix'</code>

<code>os.system(</code><code>"bash command"</code><code>)      </code><code>#运行shell命令,直接显示,所以取不到我们想要的返回值</code>

<code>os.environ                   </code><code>#获取系统环境变量</code>

<code>os.path.abspath(path)                 </code><code>#返回path规范化的绝对路径</code>

<code>os.path.split(path)                   </code><code>#将path分割成目录和文件名二元组返回</code>

<code>os.path.dirname(path)                 </code><code>#返回path的目录。即是os.path.split(path)的第一个元素</code>

<code>os.path.basename(path)                </code><code>#返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素</code>

<code>os.path.exists(path)                  </code><code>#如果path存在,返回True;如果path不存在,返回False</code>

<code>os.path.isabs(path)                  </code><code>#如果path是绝对路径,返回True</code>

<code>os.path.isfile(path)                 </code><code>#如果path是一个存在的文件,返回True。否则返回False</code>

<code>os.path.isdir(path)                  </code><code>#如果path是一个存在的目录,则返回True。否则返回False</code>

<code>os.path.join(path1[, path2[, ...]])      </code><code>#将多个路径组合后返回,第一个绝对路径之前的参数将被忽略</code>

<code>os.path.getatime(path)               </code><code>#返回path所指向的文件或者目录的最后存取时间</code>

<code>os.path.getmtime(path)               </code><code>#返回path所指向的文件或者目录的最后修改时间</code>

<code>os.path.getsize(path)                </code><code>#返回path的大小</code>

2、跨平台相关用法

<code>在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。</code>

<code>os.path.normcase(</code><code>'c:/windows\\system32\\'</code><code>)</code>

<code>print</code> <code>(os.path.normcase(</code><code>'c:/windows\\system32\\'</code><code>))           </code><code>#打印结果c:\windows\system32\</code>

<code>规范化路径,如..和 </code><code>/</code>

<code>os.path.normpath(</code><code>'c://windows\\System32\\../Temp/'</code><code>)</code>

<code>print</code> <code>(os.path.normpath(</code><code>'c://windows\\System32\\../Temp/'</code><code>))     </code><code>#打印结果c:\windows\Temp</code>

<code>a </code><code>=</code> <code>'/Users/test1/\\\a1/\\\\aa.py/../..'</code>

<code>print</code><code>(os.path.normpath(a))                               </code><code>#打印结果\Users\test1</code>

3、os路径处理

<code>#方式一:</code>

<code>print</code> <code>(os.path.normpath(os.path.join(</code>

<code>    </code><code>os.path.abspath(__file__),   </code><code>#取到当前文件的绝对路径</code>

<code>     </code><code>'..'</code><code>,                      </code><code>#取上一级目录</code>

<code>      </code><code>'..'</code>                       <code>#取上一级目录</code>

<code>)</code>

<code>))</code>

<code>#方式二:</code>

<code>print</code> <code>(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))</code>

三、sys模块

1、sys模块的用法

import sys

sys.argv           #命令行参数List,第一个元素是程序本身路径,执行脚本会得到所有的参数

sys.exit(n)        #退出程序,正常退出时exit(0)

sys.version        #获取Python解释程序的版本信息

sys.maxint         #最大的Int值

sys.path           #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值

sys.platform       #返回操作系统平台名称

2、打印进度条

<code>print</code><code>(</code><code>'[%-50s]'</code> <code>%</code><code>'#'</code><code>)              #指定宽度为</code><code>50</code><code>,左对齐,结果[#                                                 ]</code>

<code>print</code> <code>((</code><code>'[%%-%ds]'</code> <code>%</code><code>50</code><code>))           </code><code>#%%表示取消%的特殊意义,结果[%-50s]</code>

<code>print</code><code>((</code><code>'[%%-%ds]'</code> <code>%</code><code>50</code><code>) </code><code>%</code><code>'#'</code><code>)      #结果[#                                                 ]</code>

<code>print</code><code>((</code><code>'[%%-%ds]'</code> <code>%</code><code>50</code><code>) </code><code>%</code><code>(</code><code>'#'</code><code>*</code><code>5</code><code>))   #结果[#####                                             ]</code>

<code>#完整代码如下:</code>

<code>import</code> <code>sys</code>

<code>import</code> <code>time</code>

<code>def</code> <code>progress(percent,width</code><code>=</code><code>50</code><code>):</code>

<code>    </code><code>if</code> <code>percent &gt;</code><code>=</code> <code>1</code><code>:              </code><code>#百分比大于1让其强制等于1,否则会超过百分之百</code>

<code>        </code><code>percent</code><code>=</code><code>1</code>

<code>    </code><code>show_str</code><code>=</code><code>(</code><code>'[%%-%ds]'</code> <code>%</code><code>width) </code><code>%</code><code>(</code><code>int</code><code>(width</code><code>*</code><code>percent)</code><code>*</code><code>'#'</code><code>)</code>

<code>    </code><code>print</code><code>(</code><code>'\r%s %d%%'</code> <code>%</code><code>(show_str,</code><code>int</code><code>(</code><code>100</code><code>*</code><code>percent)),</code><code>file</code><code>=</code><code>sys.stdout,flush</code><code>=</code><code>True</code><code>,end</code><code>=</code><code>'')  </code><code>#\r表示跳到行首</code>

<code>#模拟数据下载:</code>

<code>data_size </code><code>=</code> <code>102511</code>             <code>#文件总大小</code>

<code>recv_size </code><code>=</code> <code>0</code>                  <code>#接收文件大小</code>

<code>while</code> <code>recv_size &lt; data_size:</code>

<code>    </code><code>time.sleep(</code><code>0.1</code><code>)                </code><code># 模拟数据的传输延迟</code>

<code>    </code><code>recv_size </code><code>+</code><code>=</code> <code>1024</code>              <code># 每次收1024</code>

<code>    </code><code>percent </code><code>=</code> <code>recv_size </code><code>/</code> <code>data_size  </code><code># 接收的比例</code>

<code>    </code><code>progress(percent, width</code><code>=</code><code>70</code><code>)      </code><code># 进度条的宽度70</code>

四、shutil模块

1、shutil模块用法

<code>import</code> <code>shutil</code>

<code>shutil.copyfileobj(</code><code>open</code><code>(</code><code>'old.xml'</code><code>, </code><code>'r'</code><code>), </code><code>open</code><code>(</code><code>'new.xml'</code><code>, </code><code>'w'</code><code>))   </code><code>#将文件内容拷贝到另一个文件中</code>

<code>shutil.copyfile(</code><code>'f1.log'</code><code>, </code><code>'f2.log'</code><code>)                     </code><code># 拷贝文件,目标文件无需存在</code>

<code>shutil.copymode(</code><code>'f1.log'</code><code>, </code><code>'f2.log'</code><code>)                     </code><code># 仅拷贝权限。内容、组、用户均不变,目标文件必须存在</code>

<code>shutil.copystat(</code><code>'f1.log'</code><code>, </code><code>'f2.log'</code><code>)           </code><code># 仅拷贝状态的信息,包括:mode bits, atime, mtime, flags,目标文件必须存在</code>

<code>shutil.copy(</code><code>'f1.log'</code><code>, </code><code>'f2.log'</code><code>)             </code><code>#拷贝文件和权限</code>

<code>shutil.copy2(</code><code>'f1.log'</code><code>, </code><code>'f2.log'</code><code>)            </code><code>#拷贝文件和状态信息</code>

<code>shutil.copytree(</code><code>'folder1'</code><code>, </code><code>'folder2'</code><code>,ignore</code><code>=</code><code>shutil.ignore_patterns(</code><code>'*.pyc'</code><code>, </code><code>'tmp*'</code><code>))     </code><code># 递归的去拷贝文件夹,目标目录不能存在,ignore的意思是排除</code>

<code>shutil.copytree(</code><code>'f1'</code><code>, </code><code>'f2'</code><code>, symlinks</code><code>=</code><code>True</code><code>, ignore</code><code>=</code><code>shutil.ignore_patterns(</code><code>'*.pyc'</code><code>, </code><code>'tmp*'</code><code>)) </code><code>#拷贝软链接,</code>

<code>shutil.rmtree(</code><code>'folder1'</code><code>)                  </code><code>#递归的去删除文件</code>

<code>shutil.move(</code><code>'folder1'</code><code>, </code><code>'folder3'</code><code>)            </code><code>#递归的去移动文件,其实就是重命名</code>

2、压缩文件

<code>(</code><code>1</code><code>) 将 </code><code>/</code><code>data 下的文件打包放置当前程序目录</code>

<code>ret </code><code>=</code> <code>shutil.make_archive(</code><code>"data_bak"</code><code>, </code><code>'gztar'</code><code>, root_dir</code><code>=</code><code>'/data'</code><code>)</code>

<code>(</code><code>2</code><code>)将 </code><code>/</code><code>data下的文件打包放置 </code><code>/</code><code>tmp</code><code>/</code><code>目录</code>

<code>ret </code><code>=</code> <code>shutil.make_archive(</code><code>"/tmp/data_bak"</code><code>, </code><code>'gztar'</code><code>, root_dir</code><code>=</code><code>'/data'</code><code>)</code>

五、json&amp;pickle模块

1、序列化

我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等

作用是:(1)持久保存状态

     (2)跨平台数据交互

2、json模块用法

<code>dic</code><code>=</code><code>{</code>

<code>    </code><code>'wang'</code><code>:{</code><code>'password'</code><code>:</code><code>'123'</code><code>,</code><code>'sex'</code><code>:</code><code>'male'</code><code>},</code>

<code>    </code><code>'li'</code><code>:{</code><code>'password'</code><code>:</code><code>'123'</code><code>,</code><code>'sex'</code><code>:</code><code>'male'</code><code>},</code>

<code>}</code>

<code>import</code> <code>json</code>

<code>json.dump(dic,</code><code>open</code><code>(r</code><code>'C:\Users\db\db.json'</code><code>,</code><code>'w'</code><code>))      </code><code>#会将数据按照json的格式写入文件db.json</code>

<code>json.load(</code><code>open</code><code>(r</code><code>'C:\Users\db\db.json'</code><code>,</code><code>'r'</code><code>))          </code><code>#取到db.json里面的数据</code>

<code>#</code>

<code>#无论数据是怎样创建的,只要满足json格式,就可以json.loads出来,不一定非要dumps的数据才能loads</code>

3、pickle模块用法

<code>import</code> <code>pickle</code>

<code>pickle.dump(dic,</code><code>open</code><code>(r</code><code>'C:\Users\db\db.json'</code><code>,</code><code>'wb'</code><code>))</code>

<code>pickle.load(</code><code>open</code><code>(r</code><code>'C:\Users\db\db.json'</code><code>,</code><code>'rb'</code><code>))</code>

<code>#pickle的用法和json差不多,不过读写是bytes类型</code>

六、shelve模块

shelve模块只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型

<code>import</code> <code>shelve</code>

<code>f</code><code>=</code><code>shelve.</code><code>open</code><code>(r</code><code>'sheve.txt'</code><code>)</code>

<code>f[</code><code>'stu1_info'</code><code>]</code><code>=</code><code>{</code><code>'name'</code><code>:</code><code>'wang'</code><code>,</code><code>'age'</code><code>:</code><code>18</code><code>,</code><code>'hobby'</code><code>:[</code><code>'smoking'</code><code>,</code><code>'drinking'</code><code>]}</code>

<code>f[</code><code>'stu2_info'</code><code>]</code><code>=</code><code>{</code><code>'name'</code><code>:</code><code>'gangdan'</code><code>,</code><code>'age'</code><code>:</code><code>53</code><code>}</code>

<code>f[</code><code>'school_info'</code><code>]</code><code>=</code><code>{</code><code>'website'</code><code>:</code><code>'http://www.pypy.org'</code><code>,</code><code>'city'</code><code>:</code><code>'beijing'</code><code>}</code>

<code>print</code><code>(f[</code><code>'stu1_info'</code><code>][</code><code>'hobby'</code><code>])</code>

<code>f.close()</code>

七、xml模块

如下一个xml文件a.xml:

&lt;?xml version="1.0"?&gt;

&lt;data v="1.0"&gt;

     hello world

    &lt;country name="Liechtenstein"&gt;

        &lt;rank updated="yes"&gt;2&lt;/rank&gt;

        &lt;year&gt;2008&lt;/year&gt;

        &lt;gdppc&gt;141100&lt;/gdppc&gt;

        &lt;neighbor name="Austria" direction="E"/&gt;

        &lt;neighbor name="Switzerland" direction="W"/&gt;

    &lt;/country&gt;

    &lt;country name="Singapore"&gt;

        &lt;rank updated="yes"&gt;5&lt;/rank&gt;

        &lt;year&gt;2011&lt;/year&gt;

        &lt;gdppc&gt;59900&lt;/gdppc&gt;

        &lt;neighbor name="Malaysia" direction="N"/&gt;

    &lt;country name="Panama"&gt;

        &lt;rank updated="yes"&gt;69&lt;/rank&gt;

        &lt;gdppc&gt;13600&lt;/gdppc&gt;

        &lt;neighbor name="Costa Rica" direction="W"/&gt;

        &lt;neighbor name="Colombia" direction="E"/&gt;

&lt;/data&gt;

1、xml模块的用法

<code>from</code> <code>xml.etree </code><code>import</code> <code>ElementTree</code>

<code>tree</code><code>=</code><code>ElementTree.parse(</code><code>'a.xml'</code><code>)</code>

<code>root</code><code>=</code><code>tree.getroot()</code>

<code>print</code><code>(root)                           </code><code>#&lt;Element 'data' at 0x0000000001E0ACC8&gt;</code>

<code>print</code><code>(root.tag)                        </code><code>#得到标签的名字 data</code>

<code>print</code><code>(root.attrib)                    </code><code>#标签的属性{'v': '1.0'}</code>

<code>print</code><code>(root.text)                      </code><code>#标签的内容hello world</code>

2、查找方式

<code>(</code><code>1</code><code>)从子节点中查找</code>

<code>print</code><code>(root.find(</code><code>'country'</code><code>))       </code><code>#&lt;Element 'country' at 0x0000000001E6CC28&gt;</code>

<code>print</code><code>(root.findall(</code><code>'country'</code><code>))    </code><code>#[&lt;Element 'country' at 0x00000000027ECC28&gt;, &lt;Element 'country' at 0x0000000002A62C78&gt;, &lt;Element 'country' at 0x0000000002A62E08&gt;]</code>

<code>print</code><code>(root.find(</code><code>'rank'</code><code>))           </code><code>#None</code>

<code>直接查找rank返回</code><code>None</code><code>,要实现找到rank,需要借助脚本:</code>

<code>for</code> <code>country </code><code>in</code> <code>root.findall(</code><code>'country'</code><code>):</code>

<code>    </code><code>rank</code><code>=</code><code>country.find(</code><code>'rank'</code><code>)</code>

<code>    </code><code>print</code><code>(rank.tag,rank.attrib,rank.text)</code>

<code>'''</code>

<code>#执行结果是:</code>

<code>rank {'updated': 'yes'} 2</code>

<code>rank {'updated': 'yes'} 5</code>

<code>rank {'updated': 'yes'} 69</code>

<code>(</code><code>2</code><code>)从整个树形结构中查找</code>

<code>print</code><code>(</code><code>list</code><code>(root.</code><code>iter</code><code>(</code><code>'rank'</code><code>)))   </code><code>#[&lt;Element 'rank' at 0x0000000002A1B598&gt;, &lt;Element 'rank' at 0x0000000002A53CC8&gt;, &lt;Element 'rank' at 0x0000000002A53E58&gt;]</code>

3、遍历整个文档

<code>for</code> <code>country </code><code>in</code> <code>root:</code>

<code>    </code><code>print</code><code>(country.attrib[</code><code>'name'</code><code>])</code>

<code>    </code><code>for</code> <code>item </code><code>in</code> <code>country:</code>

<code>        </code><code>print</code><code>(item.tag,item.attrib,item.text)</code>

<code>for</code> <code>year </code><code>in</code> <code>root.</code><code>iter</code><code>(</code><code>'year'</code><code>):    </code><code>#在整个文档中找year</code>

<code>    </code><code>print</code><code>(year.tag,year.attrib,year.text)</code>

4、修改文件中的内容

<code>for</code> <code>year </code><code>in</code> <code>root.</code><code>iter</code><code>(</code><code>'year'</code><code>):</code>

<code>    </code><code>year.</code><code>set</code><code>(</code><code>'updated'</code><code>,</code><code>'yes'</code><code>)</code>

<code>    </code><code>year.text</code><code>=</code><code>str</code><code>(</code><code>int</code><code>(year.text)</code><code>+</code><code>1</code><code>)       </code><code>#年份加1</code>

<code>tree.write(</code><code>'b.xml'</code><code>)                   </code><code>#结果写到新文件b.xml,也可以直接修改到源文件a.xml</code>

5、添加新内容

<code>    </code><code>obj</code><code>=</code><code>ElementTree.Element(</code><code>'admin'</code><code>)</code>

<code>    </code><code>obj.attrib</code><code>=</code><code>{</code><code>'name'</code><code>:</code><code>'wang'</code><code>,</code><code>'age'</code><code>:</code><code>'18'</code><code>}</code>

<code>    </code><code>obj.text</code><code>=</code><code>'hello,wang'</code>

<code>    </code><code>country.append(obj)               </code><code>#添加进文件</code>

<code>tree.write(</code><code>'b.xml'</code><code>)                  </code><code>#写入文件,所有的country下面都添加了&lt;admin age="18" name="wang"&gt;hello,wang&lt;/admin&gt;&lt;/country&gt;</code>

<code>添加到固定位置:</code>

<code>for</code> <code>rank </code><code>in</code> <code>root.</code><code>iter</code><code>(</code><code>'rank'</code><code>):</code>

<code>    </code><code>if</code> <code>int</code><code>(rank.text) </code><code>=</code><code>=</code> <code>5</code><code>:            </code><code>#只在rank值为5的地方添加</code>

<code>        </code><code>obj </code><code>=</code> <code>ElementTree.Element(</code><code>'admin'</code><code>)</code>

<code>        </code><code>obj.attrib </code><code>=</code> <code>{</code><code>'name'</code><code>: </code><code>'wang'</code><code>, </code><code>'age'</code><code>: </code><code>'18'</code><code>}</code>

<code>        </code><code>obj.text </code><code>=</code> <code>'hello,wang'</code>

<code>        </code><code>rank.append(obj)</code>

<code>tree.write(</code><code>'b.xml'</code><code>)</code>

八、configparser模块

有如下文件a.cfg,在C:\Users\a.cfg

[mysql]

user=root

password=123456

[mysqld]

port=3306

1、读取文件中的数据

<code>import</code> <code>configparser</code>

<code>config </code><code>=</code> <code>configparser.ConfigParser()</code>

<code>config.read(r</code><code>'C:\Users\a.cfg'</code><code>)</code>

<code>print</code><code>(config.sections())       </code><code>#查看所有标题 ['mysql', 'mysqld']</code>

<code>print</code><code>(config.options(</code><code>'mysql'</code><code>))   </code><code>#得到sections下对应的options的key,['user', 'password']</code>

<code>print</code> <code>(config.items(</code><code>'mysql'</code><code>))    </code><code>#[('user', 'root'), ('password', '123456')]</code>

<code>val</code><code>=</code><code>config.get(</code><code>'mysql'</code><code>,</code><code>'user'</code><code>)    </code><code>#得到key对应的值,结果是 root</code>

<code>print</code> <code>(val)</code>

<code>print</code><code>(config.getint(</code><code>'mysql'</code><code>,</code><code>'age'</code><code>))    </code><code>#取的值是整型</code>

<code>print</code><code>(config.getfloat(</code><code>'mysql'</code><code>,</code><code>'age'</code><code>))  </code><code>#取的值是浮点型</code>

2、修改文件中的数据

<code>config</code><code>=</code><code>configparser.ConfigParser()</code>

<code>config.read(</code><code>'a.cfg'</code><code>,encoding</code><code>=</code><code>'utf-8'</code><code>)</code>

<code>config.remove_section(</code><code>'mysqld'</code><code>)    </code><code>#删除整个标题mysqld</code>

<code>config.remove_option(</code><code>'mysqld'</code><code>,</code><code>'port'</code><code>)   </code><code>#删除标题mysqld下的port</code>

<code>print</code><code>(config.has_section(</code><code>'mysqld'</code><code>))    </code><code>#判断是否存在mysqld标题</code>

<code>print</code><code>(config.has_option(</code><code>'mysql'</code><code>,</code><code>'user'</code><code>))    </code><code>#判断标题mysql下是否有user</code>

<code>config.add_section(</code><code>'admin'</code><code>)                 </code><code>#添加一个标题admin</code>

<code>config.</code><code>set</code><code>(</code><code>'admin'</code><code>,</code><code>'name'</code><code>,</code><code>'wang'</code><code>)            </code><code>#在标题admin下添加name=wang,age=18的配置</code>

<code>config.</code><code>set</code><code>(</code><code>'admin'</code><code>,</code><code>'age'</code><code>,</code><code>'18'</code><code>)               </code><code>#添加的必须是字符串</code>

<code>config.write(</code><code>open</code><code>(</code><code>'a.cfg'</code><code>,</code><code>'w'</code><code>))           </code><code>#最后将修改的内容写入文件,完成最终的修改</code>

基于上述方法添加一个ini文档:

<code>config[</code><code>"DEFAULT"</code><code>] </code><code>=</code> <code>{</code><code>'ServerAliveInterval'</code><code>: </code><code>'45'</code><code>,</code>

<code>                     </code><code>'Compression'</code><code>: </code><code>'yes'</code><code>,</code>

<code>                     </code><code>'CompressionLevel'</code><code>: </code><code>'9'</code><code>}</code>

<code>config[</code><code>'bitbucket.org'</code><code>] </code><code>=</code> <code>{}</code>

<code>config[</code><code>'bitbucket.org'</code><code>][</code><code>'User'</code><code>] </code><code>=</code> <code>'hg'</code>

<code>config[</code><code>'topsecret.server.com'</code><code>] </code><code>=</code> <code>{}</code>

<code>topsecret </code><code>=</code> <code>config[</code><code>'topsecret.server.com'</code><code>]</code>

<code>topsecret[</code><code>'Host Port'</code><code>] </code><code>=</code> <code>'50022'</code>        

<code>topsecret[</code><code>'ForwardX11'</code><code>] </code><code>=</code> <code>'no'</code>          

<code>config[</code><code>'DEFAULT'</code><code>][</code><code>'ForwardX11'</code><code>] </code><code>=</code> <code>'yes'</code>

<code>with </code><code>open</code><code>(</code><code>'example.ini'</code><code>, </code><code>'w'</code><code>) as configfile:</code>

<code>    </code><code>config.write(configfile)</code>

<code>#结果是生成文件:example.ini</code>

<code>[DEFAULT]</code>

<code>serveraliveinterval </code><code>=</code> <code>45</code>

<code>compression </code><code>=</code> <code>yes</code>

<code>compressionlevel </code><code>=</code> <code>9</code>

<code>forwardx11 </code><code>=</code> <code>yes</code>

<code>[bitbucket.org]</code>

<code>user </code><code>=</code> <code>hg</code>

<code>[topsecret.server.com]</code>

<code>host port </code><code>=</code> <code>50022</code>

<code>forwardx11 </code><code>=</code> <code>no</code>

九、hashlib模块

1、介绍

hash:一种算法 ,python3里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

有三个特点:

(1)内容相同则hash运算结果相同,内容稍微改变则hash值则变

(2)不可逆推

(3)相同算法:无论校验多长的数据,得到的哈希值长度固定。

2、hashlib模块用法

<code>import</code> <code>hashlib</code>

<code>m </code><code>=</code> <code>hashlib.md5()               </code><code># m=hashlib.sha256()</code>

<code>m.update(</code><code>'hello'</code><code>.encode(</code><code>'utf8'</code><code>))</code>

<code>print</code><code>(m.hexdigest())            </code><code># 5d41402abc4b2a76b9719d911017c592</code>

<code>m.update(</code><code>'world'</code><code>.encode(</code><code>'utf8'</code><code>))</code>

<code>print</code><code>(m.hexdigest())            </code><code># fc5e038d38a57032085441e7fe7010b0</code>

<code>m2 </code><code>=</code> <code>hashlib.md5()</code>

<code>m2.update(</code><code>'helloworld'</code><code>.encode(</code><code>'utf8'</code><code>))</code>

<code>print</code><code>(m2.hexdigest())            </code><code># fc5e038d38a57032085441e7fe7010b0</code>

注意:把一段很长的数据update多次,与一次update这段长数据,得到的结果一样

这样update多次就为校验大文件提供了可能。

3、密码加密

(1)为防止撞库反解出密码。所以,有必要对加密算法中添加自定义key再来做加密

<code>hash</code> <code>=</code> <code>hashlib.sha256(</code><code>'w123q321'</code><code>.encode(</code><code>'utf8'</code><code>))     </code><code>#加密(加盐),增加密码破解难度</code>

<code>hash</code><code>.update(</code><code>'helloworld'</code><code>.encode(</code><code>'utf8'</code><code>))</code>

<code>print</code><code>(</code><code>hash</code><code>.hexdigest())  </code><code># d11039095aafd7cb72f6681aab9d55e5eff453940287e9799fdb52e09fef170c</code>

(2)python还有一个hmac模块,它内部对我们创建key和内容进行进一步的处理然后再加密:

<code>import</code> <code>hmac</code>

<code>h </code><code>=</code> <code>hmac.new(</code><code>'hello'</code><code>.encode(</code><code>'utf8'</code><code>))</code>

<code>h.update(</code><code>'world'</code><code>.encode(</code><code>'utf8'</code><code>))</code>

<code>print</code> <code>(h.hexdigest())              </code><code>#0e2564b7e100f034341ea477c23f283b</code>

注意:要想保证hmac最终结果一致,必须保证

# 1:hmac.new括号内指定的初始key一样

# 2:无论update多少次,校验的内容累加到一起是一样的内容

4、模拟撞库破解

<code>passwds</code><code>=</code><code>[                           </code><code>#猜测用户可能的密码</code>

<code>    </code><code>'alex3714'</code><code>,</code>

<code>    </code><code>'alex123'</code><code>,</code>

<code>    </code><code>'alex123456'</code><code>,</code>

<code>    </code><code>'123456'</code><code>,</code>

<code>    </code><code>'1234567890'</code><code>,</code>

<code>    </code><code>'a123456'</code><code>,</code>

<code>    </code><code>]</code>

<code>def</code> <code>make_passwd_dic(passwds):</code>

<code>    </code><code>dic</code><code>=</code><code>{}</code>

<code>    </code><code>for</code> <code>passwd </code><code>in</code> <code>passwds:</code>

<code>        </code><code>m</code><code>=</code><code>hashlib.md5()</code>

<code>        </code><code>m.update(passwd.encode(</code><code>'utf-8'</code><code>))</code>

<code>        </code><code>dic[passwd]</code><code>=</code><code>m.hexdigest()</code>

<code>    </code><code>return</code> <code>dic     </code><code>#dic得到的是原始密码和加密密码的键值对</code>

<code>def</code> <code>break_code(cryptograph,passwd_dic):</code>

<code>    </code><code>for</code> <code>k,v </code><code>in</code> <code>passwd_dic.items():</code>

<code>        </code><code>if</code> <code>v </code><code>=</code><code>=</code> <code>cryptograph:</code>

<code>            </code><code>print</code><code>(</code><code>'密码是===&gt;\033[46m%s\033[0m'</code> <code>%</code><code>k)</code>

<code>cryptograph</code><code>=</code><code>'aee949757a2e698417463d47acac93df'</code>        <code>#抓包得到的加密后的密码</code>

<code>break_code(cryptograph,make_passwd_dic(passwds))</code>

十、subprocess模块

1、subprocess模块用法

<code>import</code> <code>subprocess</code>

<code>subprocess.Popen(</code><code>'tasklist'</code><code>,shell</code><code>=</code><code>True</code><code>,</code>

<code>            </code><code>stdout </code><code>=</code> <code>subprocess.PIPE,</code>

<code>            </code><code>stderr </code><code>=</code> <code>subprocess.PIPE,</code>

<code>)                 </code><code>#交给子进程执行,不等子进程返回结果就执行后面的代码</code>

<code>print</code><code>(subprocess.Popen(</code><code>'tasklist'</code><code>,shell</code><code>=</code><code>True</code><code>) )</code>

<code>time.sleep(</code><code>1</code><code>)        </code><code>#打印到终端的有我们需要的数据,不加这行结果只是&lt;subprocess.Popen object at 0x00000000021F88D0&gt;</code>

<code>最终代码为:</code>

<code>obj</code><code>=</code><code>subprocess.Popen(</code><code>'tasklist'</code><code>,shell</code><code>=</code><code>True</code><code>,</code>

<code>print</code> <code>(obj.stdout.read().decode(</code><code>'gbk'</code><code>))</code>

2、subprocess模块实例

(1)实例一:

<code>sh-3.2# ls /Users/egon/Desktop |grep txt$</code>

<code>mysql.txt</code>

<code>tt.txt</code>

<code>事物.txt</code>

<code>import</code>  <code>subprocess</code>

<code>res1</code><code>=</code><code>subprocess.Popen(</code><code>'ls /Users/jieli/Desktop'</code><code>,shell</code><code>=</code><code>True</code><code>,stdout</code><code>=</code><code>subprocess.PIPE)</code>

<code>res</code><code>=</code><code>subprocess.Popen(</code><code>'grep txt$'</code><code>,shell</code><code>=</code><code>True</code><code>,stdin</code><code>=</code><code>res1.stdout,</code>

<code>                 </code><code>stdout</code><code>=</code><code>subprocess.PIPE)</code>

<code>print</code><code>(res.stdout.read().decode(</code><code>'utf-8'</code><code>))</code>

<code>#等同于上面,但是上面的优势在于,一个数据流可以和另外一个数据流交互,可以通过爬虫得到结果然后交给grep</code>

<code>res1</code><code>=</code><code>subprocess.Popen(</code><code>'ls /Users/jieli/Desktop |grep txt$'</code><code>,shell</code><code>=</code><code>True</code><code>,stdout</code><code>=</code><code>subprocess.PIPE)</code>

<code>print</code><code>(res1.stdout.read().decode(</code><code>'utf-8'</code><code>))</code>

<code>windows下:</code>

<code># dir | findstr 'test*'</code>

<code># dir | findstr 'txt$'</code>

<code>res1</code><code>=</code><code>subprocess.Popen(r</code><code>'dir C:\Users\Administrator\Desktop'</code><code>,shell</code><code>=</code><code>True</code><code>,stdout</code><code>=</code><code>subprocess.PIPE)</code>

<code>res</code><code>=</code><code>subprocess.Popen(</code><code>'findstr txt'</code><code>,shell</code><code>=</code><code>True</code><code>,stdin</code><code>=</code><code>res1.stdout,</code>

<code>                 </code><code>stdout</code><code>=</code><code>subprocess.PIPE)            </code><code>#过滤包含txt字符的文件</code>

<code>print</code><code>(res.stdout.read().decode(</code><code>'gbk'</code><code>))        </code><code>#得到结果为bytes类型,在windows下需要用gbk解码</code>

(2)实例二:得到关于python的进程信息

<code>obj1</code><code>=</code><code>subprocess.Popen(</code><code>'tasklist'</code><code>,shell</code><code>=</code><code>True</code><code>,</code>

<code>                 </code><code>stdout</code><code>=</code><code>subprocess.PIPE,</code>

<code>                 </code><code>stderr</code><code>=</code><code>subprocess.PIPE,</code>

<code>                 </code><code>)</code>

<code>obj2</code><code>=</code><code>subprocess.Popen(</code><code>'findstr python'</code><code>,shell</code><code>=</code><code>True</code><code>,      </code><code>#过滤有python字符串的行</code>

<code>                 </code><code>stdin</code><code>=</code><code>obj1.stdout,</code>

<code>print</code><code>(obj2.stdout.read())</code>

<code></code>

本文转自 宋鹏超 51CTO博客,原文链接:http://blog.51cto.com/qidian510/2061130,如需转载请自行联系原作者