天天看點

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,如需轉載請自行聯系原作者